@pushler/vue 1.0.1 → 1.0.3
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 +2 -7
- package/dist/pushler-vue.cjs.js +9 -14
- package/dist/pushler-vue.cjs.js.map +1 -1
- package/dist/pushler-vue.esm.js +9 -14
- package/dist/pushler-vue.esm.js.map +1 -1
- package/dist/pushler-vue.umd.js +9 -14
- package/dist/pushler-vue.umd.js.map +1 -1
- package/dist/pushler-vue.umd.min.js +2 -2
- package/dist/pushler-vue.umd.min.js.map +1 -1
- package/package.json +2 -2
- package/src/index.js +1 -3
- package/src/plugin.js +0 -1
- package/src/usePushler.js +7 -9
package/README.md
CHANGED
|
@@ -44,7 +44,6 @@ import { usePushler } from '@pushler/vue';
|
|
|
44
44
|
// Создаём экземпляр Pushler
|
|
45
45
|
const pushler = usePushler({
|
|
46
46
|
appKey: 'your-app-key',
|
|
47
|
-
wsUrl: 'wss://ws.pushler.ru/app',
|
|
48
47
|
autoConnect: true, // Автоматическое подключение
|
|
49
48
|
});
|
|
50
49
|
|
|
@@ -87,7 +86,6 @@ const app = createApp(App);
|
|
|
87
86
|
|
|
88
87
|
app.use(PushlerPlugin, {
|
|
89
88
|
appKey: 'your-app-key',
|
|
90
|
-
wsUrl: 'wss://ws.pushler.ru/app',
|
|
91
89
|
autoConnect: true,
|
|
92
90
|
});
|
|
93
91
|
|
|
@@ -120,8 +118,7 @@ channel.on('new', (data) => {
|
|
|
120
118
|
|
|
121
119
|
| Параметр | Тип | По умолчанию | Описание |
|
|
122
120
|
|----------|-----|--------------|----------|
|
|
123
|
-
| `appKey` | `string` |
|
|
124
|
-
| `wsUrl` | `string` | `'wss://ws.pushler.ru/app'` | URL WebSocket сервера |
|
|
121
|
+
| `appKey` | `string` | — | Ключ приложения Pushler (обязательный) |
|
|
125
122
|
| `authEndpoint` | `string` | `'/pushler/auth'` | Эндпоинт для авторизации приватных каналов |
|
|
126
123
|
| `autoConnect` | `boolean` | `false` | Автоматическое подключение при инициализации |
|
|
127
124
|
| `reconnectDelay` | `number` | `1000` | Задержка между попытками переподключения (мс) |
|
|
@@ -340,7 +337,6 @@ import { usePushler } from '@pushler/vue';
|
|
|
340
337
|
|
|
341
338
|
const pushler = usePushler({
|
|
342
339
|
appKey: 'chat-app-key',
|
|
343
|
-
wsUrl: 'wss://ws.pushler.ru/app',
|
|
344
340
|
autoConnect: true,
|
|
345
341
|
});
|
|
346
342
|
|
|
@@ -462,8 +458,7 @@ const typingText = computed(() => {
|
|
|
462
458
|
createApp({
|
|
463
459
|
setup() {
|
|
464
460
|
const pushler = usePushler({
|
|
465
|
-
appKey: 'your-app-key'
|
|
466
|
-
wsUrl: 'wss://ws.pushler.ru/app'
|
|
461
|
+
appKey: 'your-app-key'
|
|
467
462
|
});
|
|
468
463
|
|
|
469
464
|
return {
|
package/dist/pushler-vue.cjs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @pushler/vue v1.0.
|
|
2
|
+
* @pushler/vue v1.0.3
|
|
3
3
|
* (c) 2026 Pushler.ru
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
@@ -58,9 +58,11 @@ function usePushler(options = {}) {
|
|
|
58
58
|
const eventListeners = new Map();
|
|
59
59
|
|
|
60
60
|
// Конфигурация
|
|
61
|
+
const appKey = options.appKey || '';
|
|
61
62
|
const config = {
|
|
62
|
-
appKey:
|
|
63
|
-
|
|
63
|
+
appKey: appKey,
|
|
64
|
+
// wsUrl формируется автоматически из appKey, но можно переопределить
|
|
65
|
+
wsUrl: options.wsUrl || `wss://ws.pushler.ru/app/${appKey}`,
|
|
64
66
|
authEndpoint: options.authEndpoint || '/pushler/auth',
|
|
65
67
|
autoConnect: options.autoConnect || false,
|
|
66
68
|
reconnectDelay: options.reconnectDelay || 1000,
|
|
@@ -121,13 +123,9 @@ function usePushler(options = {}) {
|
|
|
121
123
|
error.value = null;
|
|
122
124
|
|
|
123
125
|
try {
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
: `${config.wsUrl}/${config.appKey}`;
|
|
128
|
-
|
|
129
|
-
console.log('[Pushler Vue] Connecting to:', wsUrl);
|
|
130
|
-
socket = new WebSocket(wsUrl);
|
|
126
|
+
// wsUrl уже содержит appKey из конфигурации
|
|
127
|
+
console.log('[Pushler Vue] Connecting to:', config.wsUrl);
|
|
128
|
+
socket = new WebSocket(config.wsUrl);
|
|
131
129
|
setupSocketHandlers();
|
|
132
130
|
} catch (err) {
|
|
133
131
|
console.error('[Pushler Vue] Connection error:', err);
|
|
@@ -768,7 +766,6 @@ const PushlerKey = Symbol('pushler');
|
|
|
768
766
|
* const app = createApp(App);
|
|
769
767
|
* app.use(PushlerPlugin, {
|
|
770
768
|
* appKey: 'your-app-key',
|
|
771
|
-
* wsUrl: 'wss://ws.pushler.ru/app',
|
|
772
769
|
* autoConnect: true
|
|
773
770
|
* });
|
|
774
771
|
* ```
|
|
@@ -824,8 +821,7 @@ function usePushlerInstance() {
|
|
|
824
821
|
* import { usePushler } from '@pushler/vue';
|
|
825
822
|
*
|
|
826
823
|
* const pushler = usePushler({
|
|
827
|
-
* appKey: 'your-app-key'
|
|
828
|
-
* wsUrl: 'wss://ws.pushler.ru/app'
|
|
824
|
+
* appKey: 'your-app-key'
|
|
829
825
|
* });
|
|
830
826
|
*
|
|
831
827
|
* // Подключение
|
|
@@ -855,7 +851,6 @@ function usePushlerInstance() {
|
|
|
855
851
|
* const app = createApp(App);
|
|
856
852
|
* app.use(PushlerPlugin, {
|
|
857
853
|
* appKey: 'your-app-key',
|
|
858
|
-
* wsUrl: 'wss://ws.pushler.ru/app',
|
|
859
854
|
* autoConnect: true
|
|
860
855
|
* });
|
|
861
856
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pushler-vue.cjs.js","sources":["../src/usePushler.js","../src/usePushlerChannel.js","../src/plugin.js","../src/index.js"],"sourcesContent":["import { ref, reactive, readonly, onUnmounted, watch, computed } from 'vue';\n\n/**\n * Состояния подключения\n */\nexport const ConnectionStates = {\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n};\n\n/**\n * Типы каналов\n */\nexport const ChannelTypes = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PRESENCE: 'presence'\n};\n\n/**\n * Vue composable для работы с Pushler WebSocket\n * \n * @param {Object} options - Опции подключения\n * @param {string} options.appKey - Ключ приложения\n * @param {string} options.wsUrl - URL WebSocket сервера\n * @param {string} options.authEndpoint - Эндпоинт авторизации для приватных каналов\n * @param {boolean} options.autoConnect - Автоматическое подключение (по умолчанию false)\n * @param {number} options.reconnectDelay - Задержка переподключения в мс (по умолчанию 1000)\n * @param {number} options.maxReconnectAttempts - Максимум попыток переподключения (по умолчанию 5)\n * @returns {Object} Реактивный объект с методами и состоянием\n */\nexport function usePushler(options = {}) {\n // Реактивное состояние\n const connectionState = ref(ConnectionStates.DISCONNECTED);\n const socketId = ref(null);\n const error = ref(null);\n const reconnectAttempts = ref(0);\n \n // Каналы\n const channels = reactive(new Map());\n const channelAliases = reactive(new Map());\n \n // Внутренние переменные\n let socket = null;\n let reconnectTimer = null;\n const eventListeners = new Map();\n \n // Конфигурация\n const config = {\n appKey: options.appKey || '',\n wsUrl: options.wsUrl || 'wss://ws.pushler.ru/app',\n authEndpoint: options.authEndpoint || '/pushler/auth',\n autoConnect: options.autoConnect || false,\n reconnectDelay: options.reconnectDelay || 1000,\n maxReconnectAttempts: options.maxReconnectAttempts || 5,\n };\n \n // Вычисляемые свойства\n const isConnected = computed(() => connectionState.value === ConnectionStates.CONNECTED);\n const isConnecting = computed(() => connectionState.value === ConnectionStates.CONNECTING);\n const isReconnecting = computed(() => connectionState.value === ConnectionStates.RECONNECTING);\n \n /**\n * Форматирование имени канала с префиксом appKey\n */\n function formatChannelName(channelName) {\n if (channelName.startsWith(config.appKey + ':')) {\n return channelName;\n }\n return `${config.appKey}:${channelName}`;\n }\n \n /**\n * Извлечение оригинального имени канала\n */\n function extractChannelName(fullChannelName) {\n const prefix = config.appKey + ':';\n if (fullChannelName.startsWith(prefix)) {\n return fullChannelName.substring(prefix.length);\n }\n return fullChannelName;\n }\n \n /**\n * Определение типа канала\n */\n function getChannelType(channelName) {\n const baseName = extractChannelName(channelName);\n if (baseName.startsWith('private-')) return ChannelTypes.PRIVATE;\n if (baseName.startsWith('presence-')) return ChannelTypes.PRESENCE;\n return ChannelTypes.PUBLIC;\n }\n \n /**\n * Подключение к WebSocket серверу\n */\n function connect(connectOptions = {}) {\n // Обновляем конфигурацию если переданы новые параметры\n if (connectOptions.appKey) config.appKey = connectOptions.appKey;\n if (connectOptions.wsUrl) config.wsUrl = connectOptions.wsUrl;\n if (connectOptions.authEndpoint) config.authEndpoint = connectOptions.authEndpoint;\n \n if (connectionState.value === ConnectionStates.CONNECTED ||\n connectionState.value === ConnectionStates.CONNECTING) {\n return;\n }\n \n connectionState.value = ConnectionStates.CONNECTING;\n error.value = null;\n \n try {\n // Формируем URL с ключом приложения\n const wsUrl = config.wsUrl.endsWith('/') \n ? `${config.wsUrl}${config.appKey}`\n : `${config.wsUrl}/${config.appKey}`;\n \n console.log('[Pushler Vue] Connecting to:', wsUrl);\n socket = new WebSocket(wsUrl);\n setupSocketHandlers();\n } catch (err) {\n console.error('[Pushler Vue] Connection error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = err.message;\n }\n }\n \n /**\n * Настройка обработчиков WebSocket\n */\n function setupSocketHandlers() {\n socket.onopen = () => {\n console.log('[Pushler Vue] WebSocket opened, waiting for connection_established...');\n };\n \n socket.onmessage = (event) => {\n handleMessage(event);\n };\n \n socket.onclose = (event) => {\n console.log('[Pushler Vue] WebSocket closed:', event.code, event.reason);\n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n \n // Автопереподключение\n if (event.code !== 1000 && reconnectAttempts.value < config.maxReconnectAttempts) {\n scheduleReconnect();\n }\n };\n \n socket.onerror = (err) => {\n console.error('[Pushler Vue] WebSocket error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = 'Connection failed';\n };\n }\n \n /**\n * Обработка входящих сообщений\n */\n function handleMessage(event) {\n try {\n // Поддержка нескольких сообщений в одном event\n const messages = event.data.trim().split('\\n').filter(line => line.trim());\n \n for (const msgData of messages) {\n processMessage(JSON.parse(msgData));\n }\n } catch (err) {\n console.error('[Pushler Vue] Error parsing message:', err);\n }\n }\n \n /**\n * Обработка отдельного сообщения\n */\n function processMessage(message) {\n switch (message.event) {\n case 'pushler:connection_established':\n handleConnectionEstablished(message.data);\n break;\n case 'pushler:subscription_succeeded':\n handleSubscriptionSucceeded(message);\n break;\n case 'pushler:auth_success':\n handleAuthSuccess(message);\n break;\n case 'pushler:auth_error':\n handleAuthError(message);\n break;\n default:\n handleChannelMessage(message);\n }\n }\n \n /**\n * Обработка установления соединения\n */\n function handleConnectionEstablished(data) {\n socketId.value = data.socket_id;\n connectionState.value = ConnectionStates.CONNECTED;\n reconnectAttempts.value = 0;\n \n console.log('[Pushler Vue] Connected with socket ID:', socketId.value);\n \n // Переподписка на все каналы\n resubscribeAllChannels();\n \n emit('connected', { socketId: socketId.value });\n }\n \n /**\n * Переподписка на все каналы\n */\n function resubscribeAllChannels() {\n for (const [name, channel] of channels.entries()) {\n channel.subscribed = false;\n performChannelSubscription(channel);\n }\n }\n \n /**\n * Обработка успешной подписки\n */\n function handleSubscriptionSucceeded(message) {\n const channel = channels.get(message.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data || {});\n }\n }\n \n /**\n * Обработка успешной авторизации\n */\n function handleAuthSuccess(message) {\n const channel = channels.get(message.data.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data);\n }\n emit('auth_success', message.data);\n }\n \n /**\n * Обработка ошибки авторизации\n */\n function handleAuthError(message) {\n error.value = message.data.error;\n emit('auth_error', message.data);\n }\n \n /**\n * Обработка сообщения канала\n */\n function handleChannelMessage(message) {\n const { channel: channelName, event, data } = message;\n const channel = channels.get(channelName);\n \n if (channel) {\n channel.emit(event, data);\n }\n \n emit('message', { \n channel: extractChannelName(channelName), \n event, \n data \n });\n }\n \n /**\n * Планирование переподключения\n */\n function scheduleReconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n }\n \n reconnectAttempts.value++;\n connectionState.value = ConnectionStates.RECONNECTING;\n \n const delay = config.reconnectDelay * reconnectAttempts.value;\n console.log(`[Pushler Vue] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${config.maxReconnectAttempts})`);\n \n reconnectTimer = setTimeout(() => {\n connect();\n }, delay);\n }\n \n /**\n * Отключение от сервера\n */\n function disconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n \n if (socket) {\n socket.close(1000, 'User disconnect');\n socket = null;\n }\n \n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n channels.clear();\n channelAliases.clear();\n reconnectAttempts.value = 0;\n \n emit('disconnected');\n }\n \n /**\n * Отправка сообщения через WebSocket\n */\n function sendMessage(message) {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n \n /**\n * Подписка на канал\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции (signature для приватных, user для presence)\n * @returns {Object} Реактивный объект канала\n */\n function subscribe(channelName, subscribeOptions = {}) {\n const fullChannelName = formatChannelName(channelName);\n \n if (channels.has(fullChannelName)) {\n return channels.get(fullChannelName);\n }\n \n // Создаем реактивный канал\n const channel = reactive({\n name: fullChannelName,\n originalName: channelName,\n type: getChannelType(channelName),\n subscribed: false,\n options: subscribeOptions,\n listeners: new Map(),\n \n // Методы канала\n on(event, callback) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event).push(callback);\n return this;\n },\n \n off(event, callback) {\n if (this.listeners.has(event)) {\n const list = this.listeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n return this;\n },\n \n emit(event, data) {\n if (this.listeners.has(event)) {\n this.listeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Channel event error:', err);\n }\n });\n }\n },\n \n unsubscribe() {\n unsubscribe(channelName);\n }\n });\n \n channels.set(fullChannelName, channel);\n channelAliases.set(channelName, fullChannelName);\n \n // Подписываемся если уже подключены\n if (connectionState.value === ConnectionStates.CONNECTED) {\n performChannelSubscription(channel);\n }\n \n return channel;\n }\n \n /**\n * Выполнение подписки на канал\n */\n async function performChannelSubscription(channel) {\n if (connectionState.value !== ConnectionStates.CONNECTED) {\n return;\n }\n \n const channelType = channel.type;\n \n // Публичные каналы\n if (channelType === ChannelTypes.PUBLIC) {\n sendMessage({\n event: 'pushler:subscribe',\n data: {\n channel: channel.name,\n app_key: config.appKey\n }\n });\n return;\n }\n \n // Приватные и presence каналы требуют авторизации\n try {\n const authData = await getAuthData(channel);\n sendMessage({\n event: 'pushler:auth',\n data: authData\n });\n } catch (err) {\n console.error('[Pushler Vue] Auth error:', err);\n error.value = err.message;\n }\n }\n \n /**\n * Получение данных авторизации для приватных/presence каналов\n * \n * Для приватных каналов подпись ДОЛЖНА быть получена с вашего бэкенда,\n * либо передана в options.signature при подписке.\n * \n * НИКОГДА не храните секретный ключ в клиентском коде!\n */\n async function getAuthData(channel) {\n if (!socketId.value) {\n throw new Error('Socket ID not available');\n }\n \n const authData = {\n app_key: config.appKey,\n channel: channel.name,\n socket_id: socketId.value\n };\n \n // Если подпись уже предоставлена в options\n if (channel.options.signature) {\n authData.signature = channel.options.signature;\n } else {\n // Запрашиваем подпись с бэкенда\n authData.signature = await fetchSignature(channel);\n }\n \n // Данные пользователя для presence каналов\n if (channel.type === ChannelTypes.PRESENCE && channel.options.user) {\n authData.user = channel.options.user;\n }\n \n return authData;\n }\n \n /**\n * Запрос подписи с бэкенда\n * \n * Ваш бэкенд должен:\n * 1. Проверить авторизацию пользователя\n * 2. Сгенерировать HMAC-SHA256 подпись с секретным ключом\n * 3. Вернуть подпись клиенту\n */\n async function fetchSignature(channel) {\n const response = await fetch(config.authEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Включаем куки для авторизации\n body: JSON.stringify({\n channel_name: channel.name,\n socket_id: socketId.value,\n app_key: config.appKey,\n user_data: channel.options.user\n })\n });\n \n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Auth request failed' }));\n throw new Error(err.error || 'Failed to get signature');\n }\n \n const data = await response.json();\n return data.signature;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n const channel = channels.get(fullChannelName);\n \n if (channel) {\n if (channel.subscribed && connectionState.value === ConnectionStates.CONNECTED) {\n sendMessage({\n event: 'pushler:unsubscribe',\n data: { channel: fullChannelName }\n });\n }\n \n channels.delete(fullChannelName);\n channelAliases.delete(channelName);\n }\n }\n \n /**\n * Получение канала по имени\n */\n function channel(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n return channels.get(fullChannelName);\n }\n \n /**\n * Получение списка каналов\n */\n function getChannels() {\n return Array.from(channels.values()).map(ch => ({\n name: ch.originalName,\n fullName: ch.name,\n type: ch.type,\n subscribed: ch.subscribed\n }));\n }\n \n /**\n * Подписка на глобальное событие\n */\n function on(event, callback) {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, []);\n }\n eventListeners.get(event).push(callback);\n }\n \n /**\n * Отписка от глобального события\n */\n function off(event, callback) {\n if (eventListeners.has(event)) {\n const list = eventListeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n }\n \n /**\n * Вызов глобального события\n */\n function emit(event, data) {\n if (eventListeners.has(event)) {\n eventListeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Event error:', err);\n }\n });\n }\n }\n \n // Автоматическое отключение при размонтировании компонента\n onUnmounted(() => {\n disconnect();\n });\n \n // Автоподключение если указано\n if (config.autoConnect && config.appKey) {\n connect();\n }\n \n return {\n // Состояние (readonly для защиты от внешних изменений)\n connectionState: readonly(connectionState),\n socketId: readonly(socketId),\n error: readonly(error),\n reconnectAttempts: readonly(reconnectAttempts),\n \n // Вычисляемые свойства\n isConnected,\n isConnecting,\n isReconnecting,\n \n // Методы\n connect,\n disconnect,\n subscribe,\n unsubscribe,\n channel,\n getChannels,\n on,\n off,\n \n // Утилиты\n formatChannelName,\n extractChannelName,\n getChannelType,\n \n // Константы\n ConnectionStates,\n ChannelTypes,\n };\n}\n\nexport default usePushler;\n","import { ref, reactive, onUnmounted, watch } from 'vue';\n\n/**\n * Vue composable для работы с отдельным каналом Pushler\n * \n * Можно использовать автономно или совместно с usePushler\n * \n * @param {Object} pushler - Инстанс usePushler\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции канала\n * @returns {Object} Реактивный объект канала с событиями\n */\nexport function usePushlerChannel(pushler, channelName, options = {}) {\n const channel = ref(null);\n const isSubscribed = ref(false);\n const lastEvent = ref(null);\n const events = reactive([]);\n const eventHandlers = new Map();\n \n /**\n * Максимальное количество событий в буфере\n */\n const maxEvents = options.maxEvents || 100;\n \n /**\n * Подписка на канал\n */\n function subscribe() {\n if (!pushler || !channelName) return;\n \n channel.value = pushler.subscribe(channelName, options);\n \n // Отслеживаем статус подписки\n channel.value.on('subscribed', () => {\n isSubscribed.value = true;\n });\n \n return channel.value;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe() {\n if (pushler && channelName) {\n pushler.unsubscribe(channelName);\n channel.value = null;\n isSubscribed.value = false;\n }\n }\n \n /**\n * Подписка на событие канала\n * @param {string} eventName - Имя события\n * @param {Function} callback - Обработчик\n */\n function on(eventName, callback) {\n if (!channel.value) {\n subscribe();\n }\n \n const handler = (data) => {\n // Сохраняем последнее событие\n lastEvent.value = {\n event: eventName,\n data,\n timestamp: new Date()\n };\n \n // Добавляем в буфер событий\n events.unshift(lastEvent.value);\n if (events.length > maxEvents) {\n events.pop();\n }\n \n // Вызываем пользовательский обработчик\n callback(data);\n };\n \n eventHandlers.set(eventName, handler);\n channel.value.on(eventName, handler);\n \n return () => off(eventName);\n }\n \n /**\n * Отписка от события канала\n */\n function off(eventName) {\n if (channel.value && eventHandlers.has(eventName)) {\n channel.value.off(eventName, eventHandlers.get(eventName));\n eventHandlers.delete(eventName);\n }\n }\n \n /**\n * Очистка буфера событий\n */\n function clearEvents() {\n events.length = 0;\n lastEvent.value = null;\n }\n \n // Автоматическая подписка если указано\n if (options.autoSubscribe !== false && pushler?.isConnected?.value) {\n subscribe();\n }\n \n // Подписываемся при подключении\n if (pushler) {\n watch(() => pushler.isConnected.value, (connected) => {\n if (connected && options.autoSubscribe !== false && !channel.value) {\n subscribe();\n }\n });\n }\n \n // Автоматическая отписка при размонтировании\n onUnmounted(() => {\n unsubscribe();\n });\n \n return {\n channel,\n isSubscribed,\n lastEvent,\n events,\n \n subscribe,\n unsubscribe,\n on,\n off,\n clearEvents,\n };\n}\n\nexport default usePushlerChannel;\n","import { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\n\n/**\n * Символ для инъекции Pushler\n */\nexport const PushlerKey = Symbol('pushler');\n\n/**\n * Vue Plugin для глобальной инициализации Pushler\n * \n * Использование:\n * \n * ```js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app',\n * autoConnect: true\n * });\n * ```\n * \n * Затем в компонентах:\n * \n * ```js\n * import { inject } from 'vue';\n * import { PushlerKey } from '@pushler/vue';\n * \n * const pushler = inject(PushlerKey);\n * ```\n */\nexport const PushlerPlugin = {\n install(app, options = {}) {\n // Создаем глобальный инстанс Pushler\n const pushler = usePushler(options);\n \n // Предоставляем через provide/inject\n app.provide(PushlerKey, pushler);\n \n // Также добавляем как глобальное свойство (для Options API)\n app.config.globalProperties.$pushler = pushler;\n \n // Экспортируем константы\n app.config.globalProperties.$PushlerConnectionStates = ConnectionStates;\n app.config.globalProperties.$PushlerChannelTypes = ChannelTypes;\n }\n};\n\n/**\n * Хелпер для получения инстанса Pushler в setup()\n */\nexport function usePushlerInstance() {\n const pushler = inject(PushlerKey);\n if (!pushler) {\n throw new Error(\n '[Pushler Vue] No Pushler instance found. ' +\n 'Make sure to install PushlerPlugin or provide a Pushler instance.'\n );\n }\n return pushler;\n}\n\nexport default PushlerPlugin;\n","/**\n * Pushler Vue SDK\n * \n * Реактивный Vue.js SDK для работы с Pushler.ru WebSocket сервером\n * \n * @example Базовое использование\n * ```vue\n * <script setup>\n * import { usePushler } from '@pushler/vue';\n * \n * const pushler = usePushler({\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app'\n * });\n * \n * // Подключение\n * pushler.connect();\n * \n * // Подписка на канал\n * const channel = pushler.subscribe('my-channel');\n * channel.on('message', (data) => {\n * console.log('Received:', data);\n * });\n * </script>\n * \n * <template>\n * <div>\n * <p>Status: {{ pushler.connectionState }}</p>\n * <p>Socket ID: {{ pushler.socketId }}</p>\n * </div>\n * </template>\n * ```\n * \n * @example С Vue Plugin\n * ```js\n * // main.js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app',\n * autoConnect: true\n * });\n * ```\n */\n\n// Основные composables\nexport { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\nexport { usePushlerChannel } from './usePushlerChannel';\n\n// Plugin\nexport { PushlerPlugin, PushlerKey, usePushlerInstance } from './plugin';\n\n// Default export\nimport { usePushler } from './usePushler';\nexport default usePushler;\n"],"names":["ref","reactive","computed","onUnmounted","readonly","watch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pushler-vue.cjs.js","sources":["../src/usePushler.js","../src/usePushlerChannel.js","../src/plugin.js","../src/index.js"],"sourcesContent":["import { ref, reactive, readonly, onUnmounted, watch, computed } from 'vue';\n\n/**\n * Состояния подключения\n */\nexport const ConnectionStates = {\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n};\n\n/**\n * Типы каналов\n */\nexport const ChannelTypes = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PRESENCE: 'presence'\n};\n\n/**\n * Vue composable для работы с Pushler WebSocket\n * \n * @param {Object} options - Опции подключения\n * @param {string} options.appKey - Ключ приложения\n * @param {string} options.wsUrl - URL WebSocket сервера\n * @param {string} options.authEndpoint - Эндпоинт авторизации для приватных каналов\n * @param {boolean} options.autoConnect - Автоматическое подключение (по умолчанию false)\n * @param {number} options.reconnectDelay - Задержка переподключения в мс (по умолчанию 1000)\n * @param {number} options.maxReconnectAttempts - Максимум попыток переподключения (по умолчанию 5)\n * @returns {Object} Реактивный объект с методами и состоянием\n */\nexport function usePushler(options = {}) {\n // Реактивное состояние\n const connectionState = ref(ConnectionStates.DISCONNECTED);\n const socketId = ref(null);\n const error = ref(null);\n const reconnectAttempts = ref(0);\n \n // Каналы\n const channels = reactive(new Map());\n const channelAliases = reactive(new Map());\n \n // Внутренние переменные\n let socket = null;\n let reconnectTimer = null;\n const eventListeners = new Map();\n \n // Конфигурация\n const appKey = options.appKey || '';\n const config = {\n appKey: appKey,\n // wsUrl формируется автоматически из appKey, но можно переопределить\n wsUrl: options.wsUrl || `wss://ws.pushler.ru/app/${appKey}`,\n authEndpoint: options.authEndpoint || '/pushler/auth',\n autoConnect: options.autoConnect || false,\n reconnectDelay: options.reconnectDelay || 1000,\n maxReconnectAttempts: options.maxReconnectAttempts || 5,\n };\n \n // Вычисляемые свойства\n const isConnected = computed(() => connectionState.value === ConnectionStates.CONNECTED);\n const isConnecting = computed(() => connectionState.value === ConnectionStates.CONNECTING);\n const isReconnecting = computed(() => connectionState.value === ConnectionStates.RECONNECTING);\n \n /**\n * Форматирование имени канала с префиксом appKey\n */\n function formatChannelName(channelName) {\n if (channelName.startsWith(config.appKey + ':')) {\n return channelName;\n }\n return `${config.appKey}:${channelName}`;\n }\n \n /**\n * Извлечение оригинального имени канала\n */\n function extractChannelName(fullChannelName) {\n const prefix = config.appKey + ':';\n if (fullChannelName.startsWith(prefix)) {\n return fullChannelName.substring(prefix.length);\n }\n return fullChannelName;\n }\n \n /**\n * Определение типа канала\n */\n function getChannelType(channelName) {\n const baseName = extractChannelName(channelName);\n if (baseName.startsWith('private-')) return ChannelTypes.PRIVATE;\n if (baseName.startsWith('presence-')) return ChannelTypes.PRESENCE;\n return ChannelTypes.PUBLIC;\n }\n \n /**\n * Подключение к WebSocket серверу\n */\n function connect(connectOptions = {}) {\n // Обновляем конфигурацию если переданы новые параметры\n if (connectOptions.appKey) config.appKey = connectOptions.appKey;\n if (connectOptions.wsUrl) config.wsUrl = connectOptions.wsUrl;\n if (connectOptions.authEndpoint) config.authEndpoint = connectOptions.authEndpoint;\n \n if (connectionState.value === ConnectionStates.CONNECTED ||\n connectionState.value === ConnectionStates.CONNECTING) {\n return;\n }\n \n connectionState.value = ConnectionStates.CONNECTING;\n error.value = null;\n \n try {\n // wsUrl уже содержит appKey из конфигурации\n console.log('[Pushler Vue] Connecting to:', config.wsUrl);\n socket = new WebSocket(config.wsUrl);\n setupSocketHandlers();\n } catch (err) {\n console.error('[Pushler Vue] Connection error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = err.message;\n }\n }\n \n /**\n * Настройка обработчиков WebSocket\n */\n function setupSocketHandlers() {\n socket.onopen = () => {\n console.log('[Pushler Vue] WebSocket opened, waiting for connection_established...');\n };\n \n socket.onmessage = (event) => {\n handleMessage(event);\n };\n \n socket.onclose = (event) => {\n console.log('[Pushler Vue] WebSocket closed:', event.code, event.reason);\n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n \n // Автопереподключение\n if (event.code !== 1000 && reconnectAttempts.value < config.maxReconnectAttempts) {\n scheduleReconnect();\n }\n };\n \n socket.onerror = (err) => {\n console.error('[Pushler Vue] WebSocket error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = 'Connection failed';\n };\n }\n \n /**\n * Обработка входящих сообщений\n */\n function handleMessage(event) {\n try {\n // Поддержка нескольких сообщений в одном event\n const messages = event.data.trim().split('\\n').filter(line => line.trim());\n \n for (const msgData of messages) {\n processMessage(JSON.parse(msgData));\n }\n } catch (err) {\n console.error('[Pushler Vue] Error parsing message:', err);\n }\n }\n \n /**\n * Обработка отдельного сообщения\n */\n function processMessage(message) {\n switch (message.event) {\n case 'pushler:connection_established':\n handleConnectionEstablished(message.data);\n break;\n case 'pushler:subscription_succeeded':\n handleSubscriptionSucceeded(message);\n break;\n case 'pushler:auth_success':\n handleAuthSuccess(message);\n break;\n case 'pushler:auth_error':\n handleAuthError(message);\n break;\n default:\n handleChannelMessage(message);\n }\n }\n \n /**\n * Обработка установления соединения\n */\n function handleConnectionEstablished(data) {\n socketId.value = data.socket_id;\n connectionState.value = ConnectionStates.CONNECTED;\n reconnectAttempts.value = 0;\n \n console.log('[Pushler Vue] Connected with socket ID:', socketId.value);\n \n // Переподписка на все каналы\n resubscribeAllChannels();\n \n emit('connected', { socketId: socketId.value });\n }\n \n /**\n * Переподписка на все каналы\n */\n function resubscribeAllChannels() {\n for (const [name, channel] of channels.entries()) {\n channel.subscribed = false;\n performChannelSubscription(channel);\n }\n }\n \n /**\n * Обработка успешной подписки\n */\n function handleSubscriptionSucceeded(message) {\n const channel = channels.get(message.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data || {});\n }\n }\n \n /**\n * Обработка успешной авторизации\n */\n function handleAuthSuccess(message) {\n const channel = channels.get(message.data.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data);\n }\n emit('auth_success', message.data);\n }\n \n /**\n * Обработка ошибки авторизации\n */\n function handleAuthError(message) {\n error.value = message.data.error;\n emit('auth_error', message.data);\n }\n \n /**\n * Обработка сообщения канала\n */\n function handleChannelMessage(message) {\n const { channel: channelName, event, data } = message;\n const channel = channels.get(channelName);\n \n if (channel) {\n channel.emit(event, data);\n }\n \n emit('message', { \n channel: extractChannelName(channelName), \n event, \n data \n });\n }\n \n /**\n * Планирование переподключения\n */\n function scheduleReconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n }\n \n reconnectAttempts.value++;\n connectionState.value = ConnectionStates.RECONNECTING;\n \n const delay = config.reconnectDelay * reconnectAttempts.value;\n console.log(`[Pushler Vue] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${config.maxReconnectAttempts})`);\n \n reconnectTimer = setTimeout(() => {\n connect();\n }, delay);\n }\n \n /**\n * Отключение от сервера\n */\n function disconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n \n if (socket) {\n socket.close(1000, 'User disconnect');\n socket = null;\n }\n \n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n channels.clear();\n channelAliases.clear();\n reconnectAttempts.value = 0;\n \n emit('disconnected');\n }\n \n /**\n * Отправка сообщения через WebSocket\n */\n function sendMessage(message) {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n \n /**\n * Подписка на канал\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции (signature для приватных, user для presence)\n * @returns {Object} Реактивный объект канала\n */\n function subscribe(channelName, subscribeOptions = {}) {\n const fullChannelName = formatChannelName(channelName);\n \n if (channels.has(fullChannelName)) {\n return channels.get(fullChannelName);\n }\n \n // Создаем реактивный канал\n const channel = reactive({\n name: fullChannelName,\n originalName: channelName,\n type: getChannelType(channelName),\n subscribed: false,\n options: subscribeOptions,\n listeners: new Map(),\n \n // Методы канала\n on(event, callback) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event).push(callback);\n return this;\n },\n \n off(event, callback) {\n if (this.listeners.has(event)) {\n const list = this.listeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n return this;\n },\n \n emit(event, data) {\n if (this.listeners.has(event)) {\n this.listeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Channel event error:', err);\n }\n });\n }\n },\n \n unsubscribe() {\n unsubscribe(channelName);\n }\n });\n \n channels.set(fullChannelName, channel);\n channelAliases.set(channelName, fullChannelName);\n \n // Подписываемся если уже подключены\n if (connectionState.value === ConnectionStates.CONNECTED) {\n performChannelSubscription(channel);\n }\n \n return channel;\n }\n \n /**\n * Выполнение подписки на канал\n */\n async function performChannelSubscription(channel) {\n if (connectionState.value !== ConnectionStates.CONNECTED) {\n return;\n }\n \n const channelType = channel.type;\n \n // Публичные каналы\n if (channelType === ChannelTypes.PUBLIC) {\n sendMessage({\n event: 'pushler:subscribe',\n data: {\n channel: channel.name,\n app_key: config.appKey\n }\n });\n return;\n }\n \n // Приватные и presence каналы требуют авторизации\n try {\n const authData = await getAuthData(channel);\n sendMessage({\n event: 'pushler:auth',\n data: authData\n });\n } catch (err) {\n console.error('[Pushler Vue] Auth error:', err);\n error.value = err.message;\n }\n }\n \n /**\n * Получение данных авторизации для приватных/presence каналов\n * \n * Для приватных каналов подпись ДОЛЖНА быть получена с вашего бэкенда,\n * либо передана в options.signature при подписке.\n * \n * НИКОГДА не храните секретный ключ в клиентском коде!\n */\n async function getAuthData(channel) {\n if (!socketId.value) {\n throw new Error('Socket ID not available');\n }\n \n const authData = {\n app_key: config.appKey,\n channel: channel.name,\n socket_id: socketId.value\n };\n \n // Если подпись уже предоставлена в options\n if (channel.options.signature) {\n authData.signature = channel.options.signature;\n } else {\n // Запрашиваем подпись с бэкенда\n authData.signature = await fetchSignature(channel);\n }\n \n // Данные пользователя для presence каналов\n if (channel.type === ChannelTypes.PRESENCE && channel.options.user) {\n authData.user = channel.options.user;\n }\n \n return authData;\n }\n \n /**\n * Запрос подписи с бэкенда\n * \n * Ваш бэкенд должен:\n * 1. Проверить авторизацию пользователя\n * 2. Сгенерировать HMAC-SHA256 подпись с секретным ключом\n * 3. Вернуть подпись клиенту\n */\n async function fetchSignature(channel) {\n const response = await fetch(config.authEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Включаем куки для авторизации\n body: JSON.stringify({\n channel_name: channel.name,\n socket_id: socketId.value,\n app_key: config.appKey,\n user_data: channel.options.user\n })\n });\n \n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Auth request failed' }));\n throw new Error(err.error || 'Failed to get signature');\n }\n \n const data = await response.json();\n return data.signature;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n const channel = channels.get(fullChannelName);\n \n if (channel) {\n if (channel.subscribed && connectionState.value === ConnectionStates.CONNECTED) {\n sendMessage({\n event: 'pushler:unsubscribe',\n data: { channel: fullChannelName }\n });\n }\n \n channels.delete(fullChannelName);\n channelAliases.delete(channelName);\n }\n }\n \n /**\n * Получение канала по имени\n */\n function channel(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n return channels.get(fullChannelName);\n }\n \n /**\n * Получение списка каналов\n */\n function getChannels() {\n return Array.from(channels.values()).map(ch => ({\n name: ch.originalName,\n fullName: ch.name,\n type: ch.type,\n subscribed: ch.subscribed\n }));\n }\n \n /**\n * Подписка на глобальное событие\n */\n function on(event, callback) {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, []);\n }\n eventListeners.get(event).push(callback);\n }\n \n /**\n * Отписка от глобального события\n */\n function off(event, callback) {\n if (eventListeners.has(event)) {\n const list = eventListeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n }\n \n /**\n * Вызов глобального события\n */\n function emit(event, data) {\n if (eventListeners.has(event)) {\n eventListeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Event error:', err);\n }\n });\n }\n }\n \n // Автоматическое отключение при размонтировании компонента\n onUnmounted(() => {\n disconnect();\n });\n \n // Автоподключение если указано\n if (config.autoConnect && config.appKey) {\n connect();\n }\n \n return {\n // Состояние (readonly для защиты от внешних изменений)\n connectionState: readonly(connectionState),\n socketId: readonly(socketId),\n error: readonly(error),\n reconnectAttempts: readonly(reconnectAttempts),\n \n // Вычисляемые свойства\n isConnected,\n isConnecting,\n isReconnecting,\n \n // Методы\n connect,\n disconnect,\n subscribe,\n unsubscribe,\n channel,\n getChannels,\n on,\n off,\n \n // Утилиты\n formatChannelName,\n extractChannelName,\n getChannelType,\n \n // Константы\n ConnectionStates,\n ChannelTypes,\n };\n}\n\nexport default usePushler;\n","import { ref, reactive, onUnmounted, watch } from 'vue';\n\n/**\n * Vue composable для работы с отдельным каналом Pushler\n * \n * Можно использовать автономно или совместно с usePushler\n * \n * @param {Object} pushler - Инстанс usePushler\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции канала\n * @returns {Object} Реактивный объект канала с событиями\n */\nexport function usePushlerChannel(pushler, channelName, options = {}) {\n const channel = ref(null);\n const isSubscribed = ref(false);\n const lastEvent = ref(null);\n const events = reactive([]);\n const eventHandlers = new Map();\n \n /**\n * Максимальное количество событий в буфере\n */\n const maxEvents = options.maxEvents || 100;\n \n /**\n * Подписка на канал\n */\n function subscribe() {\n if (!pushler || !channelName) return;\n \n channel.value = pushler.subscribe(channelName, options);\n \n // Отслеживаем статус подписки\n channel.value.on('subscribed', () => {\n isSubscribed.value = true;\n });\n \n return channel.value;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe() {\n if (pushler && channelName) {\n pushler.unsubscribe(channelName);\n channel.value = null;\n isSubscribed.value = false;\n }\n }\n \n /**\n * Подписка на событие канала\n * @param {string} eventName - Имя события\n * @param {Function} callback - Обработчик\n */\n function on(eventName, callback) {\n if (!channel.value) {\n subscribe();\n }\n \n const handler = (data) => {\n // Сохраняем последнее событие\n lastEvent.value = {\n event: eventName,\n data,\n timestamp: new Date()\n };\n \n // Добавляем в буфер событий\n events.unshift(lastEvent.value);\n if (events.length > maxEvents) {\n events.pop();\n }\n \n // Вызываем пользовательский обработчик\n callback(data);\n };\n \n eventHandlers.set(eventName, handler);\n channel.value.on(eventName, handler);\n \n return () => off(eventName);\n }\n \n /**\n * Отписка от события канала\n */\n function off(eventName) {\n if (channel.value && eventHandlers.has(eventName)) {\n channel.value.off(eventName, eventHandlers.get(eventName));\n eventHandlers.delete(eventName);\n }\n }\n \n /**\n * Очистка буфера событий\n */\n function clearEvents() {\n events.length = 0;\n lastEvent.value = null;\n }\n \n // Автоматическая подписка если указано\n if (options.autoSubscribe !== false && pushler?.isConnected?.value) {\n subscribe();\n }\n \n // Подписываемся при подключении\n if (pushler) {\n watch(() => pushler.isConnected.value, (connected) => {\n if (connected && options.autoSubscribe !== false && !channel.value) {\n subscribe();\n }\n });\n }\n \n // Автоматическая отписка при размонтировании\n onUnmounted(() => {\n unsubscribe();\n });\n \n return {\n channel,\n isSubscribed,\n lastEvent,\n events,\n \n subscribe,\n unsubscribe,\n on,\n off,\n clearEvents,\n };\n}\n\nexport default usePushlerChannel;\n","import { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\n\n/**\n * Символ для инъекции Pushler\n */\nexport const PushlerKey = Symbol('pushler');\n\n/**\n * Vue Plugin для глобальной инициализации Pushler\n * \n * Использование:\n * \n * ```js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * autoConnect: true\n * });\n * ```\n * \n * Затем в компонентах:\n * \n * ```js\n * import { inject } from 'vue';\n * import { PushlerKey } from '@pushler/vue';\n * \n * const pushler = inject(PushlerKey);\n * ```\n */\nexport const PushlerPlugin = {\n install(app, options = {}) {\n // Создаем глобальный инстанс Pushler\n const pushler = usePushler(options);\n \n // Предоставляем через provide/inject\n app.provide(PushlerKey, pushler);\n \n // Также добавляем как глобальное свойство (для Options API)\n app.config.globalProperties.$pushler = pushler;\n \n // Экспортируем константы\n app.config.globalProperties.$PushlerConnectionStates = ConnectionStates;\n app.config.globalProperties.$PushlerChannelTypes = ChannelTypes;\n }\n};\n\n/**\n * Хелпер для получения инстанса Pushler в setup()\n */\nexport function usePushlerInstance() {\n const pushler = inject(PushlerKey);\n if (!pushler) {\n throw new Error(\n '[Pushler Vue] No Pushler instance found. ' +\n 'Make sure to install PushlerPlugin or provide a Pushler instance.'\n );\n }\n return pushler;\n}\n\nexport default PushlerPlugin;\n","/**\n * Pushler Vue SDK\n * \n * Реактивный Vue.js SDK для работы с Pushler.ru WebSocket сервером\n * \n * @example Базовое использование\n * ```vue\n * <script setup>\n * import { usePushler } from '@pushler/vue';\n * \n * const pushler = usePushler({\n * appKey: 'your-app-key'\n * });\n * \n * // Подключение\n * pushler.connect();\n * \n * // Подписка на канал\n * const channel = pushler.subscribe('my-channel');\n * channel.on('message', (data) => {\n * console.log('Received:', data);\n * });\n * </script>\n * \n * <template>\n * <div>\n * <p>Status: {{ pushler.connectionState }}</p>\n * <p>Socket ID: {{ pushler.socketId }}</p>\n * </div>\n * </template>\n * ```\n * \n * @example С Vue Plugin\n * ```js\n * // main.js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * autoConnect: true\n * });\n * ```\n */\n\n// Основные composables\nexport { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\nexport { usePushlerChannel } from './usePushlerChannel';\n\n// Plugin\nexport { PushlerPlugin, PushlerKey, usePushlerInstance } from './plugin';\n\n// Default export\nimport { usePushler } from './usePushler';\nexport default usePushler;\n"],"names":["ref","reactive","computed","onUnmounted","readonly","watch"],"mappings":";;;;;;;;;;;AAEA;AACA;AACA;AACY,MAAC,gBAAgB,GAAG;AAChC,EAAE,UAAU,EAAE,YAAY;AAC1B,EAAE,SAAS,EAAE,WAAW;AACxB,EAAE,YAAY,EAAE,cAAc;AAC9B,EAAE,YAAY,EAAE,cAAc;AAC9B,EAAE,MAAM,EAAE;AACV;;AAEA;AACA;AACA;AACY,MAAC,YAAY,GAAG;AAC5B,EAAE,MAAM,EAAE,QAAQ;AAClB,EAAE,OAAO,EAAE,SAAS;AACpB,EAAE,QAAQ,EAAE;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,UAAU,CAAC,OAAO,GAAG,EAAE,EAAE;AACzC;AACA,EAAE,MAAM,eAAe,GAAGA,OAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC;AAC5D,EAAE,MAAM,QAAQ,GAAGA,OAAG,CAAC,IAAI,CAAC;AAC5B,EAAE,MAAM,KAAK,GAAGA,OAAG,CAAC,IAAI,CAAC;AACzB,EAAE,MAAM,iBAAiB,GAAGA,OAAG,CAAC,CAAC,CAAC;AAClC;AACA;AACA,EAAE,MAAM,QAAQ,GAAGC,YAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;AACtC,EAAE,MAAM,cAAc,GAAGA,YAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;AAC5C;AACA;AACA,EAAE,IAAI,MAAM,GAAG,IAAI;AACnB,EAAE,IAAI,cAAc,GAAG,IAAI;AAC3B,EAAE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE;AAClC;AACA;AACA,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE;AACrC,EAAE,MAAM,MAAM,GAAG;AACjB,IAAI,MAAM,EAAE,MAAM;AAClB;AACA,IAAI,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;AAC/D,IAAI,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,eAAe;AACzD,IAAI,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;AAC7C,IAAI,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;AAClD,IAAI,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,CAAC;AAC3D,GAAG;AACH;AACA;AACA,EAAE,MAAM,WAAW,GAAGC,YAAQ,CAAC,MAAM,eAAe,CAAC,KAAK,KAAK,gBAAgB,CAAC,SAAS,CAAC;AAC1F,EAAE,MAAM,YAAY,GAAGA,YAAQ,CAAC,MAAM,eAAe,CAAC,KAAK,KAAK,gBAAgB,CAAC,UAAU,CAAC;AAC5F,EAAE,MAAM,cAAc,GAAGA,YAAQ,CAAC,MAAM,eAAe,CAAC,KAAK,KAAK,gBAAgB,CAAC,YAAY,CAAC;AAChG;AACA;AACA;AACA;AACA,EAAE,SAAS,iBAAiB,CAAC,WAAW,EAAE;AAC1C,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;AACrD,MAAM,OAAO,WAAW;AACxB,IAAI;AACJ,IAAI,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC5C,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,kBAAkB,CAAC,eAAe,EAAE;AAC/C,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG;AACtC,IAAI,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAC5C,MAAM,OAAO,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;AACrD,IAAI;AACJ,IAAI,OAAO,eAAe;AAC1B,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,cAAc,CAAC,WAAW,EAAE;AACvC,IAAI,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC;AACpD,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,YAAY,CAAC,OAAO;AACpE,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,OAAO,YAAY,CAAC,QAAQ;AACtE,IAAI,OAAO,YAAY,CAAC,MAAM;AAC9B,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,OAAO,CAAC,cAAc,GAAG,EAAE,EAAE;AACxC;AACA,IAAI,IAAI,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM;AACpE,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK;AACjE,IAAI,IAAI,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,GAAG,cAAc,CAAC,YAAY;AACtF;AACA,IAAI,IAAI,eAAe,CAAC,KAAK,KAAK,gBAAgB,CAAC,SAAS;AAC5D,QAAQ,eAAe,CAAC,KAAK,KAAK,gBAAgB,CAAC,UAAU,EAAE;AAC/D,MAAM;AACN,IAAI;AACJ;AACA,IAAI,eAAe,CAAC,KAAK,GAAG,gBAAgB,CAAC,UAAU;AACvD,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI;AACtB;AACA,IAAI,IAAI;AACR;AACA,MAAM,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,KAAK,CAAC;AAC/D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;AAC1C,MAAM,mBAAmB,EAAE;AAC3B,IAAI,CAAC,CAAC,OAAO,GAAG,EAAE;AAClB,MAAM,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC;AAC3D,MAAM,eAAe,CAAC,KAAK,GAAG,gBAAgB,CAAC,MAAM;AACrD,MAAM,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO;AAC/B,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,mBAAmB,GAAG;AACjC,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM;AAC1B,MAAM,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC;AAC1F,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,KAAK,KAAK;AAClC,MAAM,aAAa,CAAC,KAAK,CAAC;AAC1B,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,KAAK;AAChC,MAAM,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;AAC9E,MAAM,eAAe,CAAC,KAAK,GAAG,gBAAgB,CAAC,YAAY;AAC3D,MAAM,QAAQ,CAAC,KAAK,GAAG,IAAI;AAC3B;AACA;AACA,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,iBAAiB,CAAC,KAAK,GAAG,MAAM,CAAC,oBAAoB,EAAE;AACxF,QAAQ,iBAAiB,EAAE;AAC3B,MAAM;AACN,IAAI,CAAC;AACL;AACA,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK;AAC9B,MAAM,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC;AAC1D,MAAM,eAAe,CAAC,KAAK,GAAG,gBAAgB,CAAC,MAAM;AACrD,MAAM,KAAK,CAAC,KAAK,GAAG,mBAAmB;AACvC,IAAI,CAAC;AACL,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,aAAa,CAAC,KAAK,EAAE;AAChC,IAAI,IAAI;AACR;AACA,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAChF;AACA,MAAM,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AACtC,QAAQ,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC3C,MAAM;AACN,IAAI,CAAC,CAAC,OAAO,GAAG,EAAE;AAClB,MAAM,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC;AAChE,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,cAAc,CAAC,OAAO,EAAE;AACnC,IAAI,QAAQ,OAAO,CAAC,KAAK;AACzB,MAAM,KAAK,gCAAgC;AAC3C,QAAQ,2BAA2B,CAAC,OAAO,CAAC,IAAI,CAAC;AACjD,QAAQ;AACR,MAAM,KAAK,gCAAgC;AAC3C,QAAQ,2BAA2B,CAAC,OAAO,CAAC;AAC5C,QAAQ;AACR,MAAM,KAAK,sBAAsB;AACjC,QAAQ,iBAAiB,CAAC,OAAO,CAAC;AAClC,QAAQ;AACR,MAAM,KAAK,oBAAoB;AAC/B,QAAQ,eAAe,CAAC,OAAO,CAAC;AAChC,QAAQ;AACR,MAAM;AACN,QAAQ,oBAAoB,CAAC,OAAO,CAAC;AACrC;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,2BAA2B,CAAC,IAAI,EAAE;AAC7C,IAAI,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;AACnC,IAAI,eAAe,CAAC,KAAK,GAAG,gBAAgB,CAAC,SAAS;AACtD,IAAI,iBAAiB,CAAC,KAAK,GAAG,CAAC;AAC/B;AACA,IAAI,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,QAAQ,CAAC,KAAK,CAAC;AAC1E;AACA;AACA,IAAI,sBAAsB,EAAE;AAC5B;AACA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnD,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,sBAAsB,GAAG;AACpC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;AACtD,MAAM,OAAO,CAAC,UAAU,GAAG,KAAK;AAChC,MAAM,0BAA0B,CAAC,OAAO,CAAC;AACzC,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,2BAA2B,CAAC,OAAO,EAAE;AAChD,IAAI,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;AACjD,IAAI,IAAI,OAAO,EAAE;AACjB,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI;AAC/B,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;AACpD,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,iBAAiB,CAAC,OAAO,EAAE;AACtC,IAAI,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AACtD,IAAI,IAAI,OAAO,EAAE;AACjB,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI;AAC/B,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC;AAC9C,IAAI;AACJ,IAAI,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC;AACtC,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,eAAe,CAAC,OAAO,EAAE;AACpC,IAAI,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK;AACpC,IAAI,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC;AACpC,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,oBAAoB,CAAC,OAAO,EAAE;AACzC,IAAI,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO;AACzD,IAAI,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;AAC7C;AACA,IAAI,IAAI,OAAO,EAAE;AACjB,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;AAC/B,IAAI;AACJ;AACA,IAAI,IAAI,CAAC,SAAS,EAAE;AACpB,MAAM,OAAO,EAAE,kBAAkB,CAAC,WAAW,CAAC;AAC9C,MAAM,KAAK;AACX,MAAM,IAAI;AACV,KAAK,CAAC;AACN,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,iBAAiB,GAAG;AAC/B,IAAI,IAAI,cAAc,EAAE;AACxB,MAAM,YAAY,CAAC,cAAc,CAAC;AAClC,IAAI;AACJ;AACA,IAAI,iBAAiB,CAAC,KAAK,EAAE;AAC7B,IAAI,eAAe,CAAC,KAAK,GAAG,gBAAgB,CAAC,YAAY;AACzD;AACA,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,GAAG,iBAAiB,CAAC,KAAK;AACjE,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,8BAA8B,EAAE,KAAK,CAAC,YAAY,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAC/H;AACA,IAAI,cAAc,GAAG,UAAU,CAAC,MAAM;AACtC,MAAM,OAAO,EAAE;AACf,IAAI,CAAC,EAAE,KAAK,CAAC;AACb,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,UAAU,GAAG;AACxB,IAAI,IAAI,cAAc,EAAE;AACxB,MAAM,YAAY,CAAC,cAAc,CAAC;AAClC,MAAM,cAAc,GAAG,IAAI;AAC3B,IAAI;AACJ;AACA,IAAI,IAAI,MAAM,EAAE;AAChB,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,CAAC;AAC3C,MAAM,MAAM,GAAG,IAAI;AACnB,IAAI;AACJ;AACA,IAAI,eAAe,CAAC,KAAK,GAAG,gBAAgB,CAAC,YAAY;AACzD,IAAI,QAAQ,CAAC,KAAK,GAAG,IAAI;AACzB,IAAI,QAAQ,CAAC,KAAK,EAAE;AACpB,IAAI,cAAc,CAAC,KAAK,EAAE;AAC1B,IAAI,iBAAiB,CAAC,KAAK,GAAG,CAAC;AAC/B;AACA,IAAI,IAAI,CAAC,cAAc,CAAC;AACxB,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,WAAW,CAAC,OAAO,EAAE;AAChC,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;AACxD,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC1C,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,SAAS,CAAC,WAAW,EAAE,gBAAgB,GAAG,EAAE,EAAE;AACzD,IAAI,MAAM,eAAe,GAAG,iBAAiB,CAAC,WAAW,CAAC;AAC1D;AACA,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;AACvC,MAAM,OAAO,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;AAC1C,IAAI;AACJ;AACA;AACA,IAAI,MAAM,OAAO,GAAGD,YAAQ,CAAC;AAC7B,MAAM,IAAI,EAAE,eAAe;AAC3B,MAAM,YAAY,EAAE,WAAW;AAC/B,MAAM,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC;AACvC,MAAM,UAAU,EAAE,KAAK;AACvB,MAAM,OAAO,EAAE,gBAAgB;AAC/B,MAAM,SAAS,EAAE,IAAI,GAAG,EAAE;AAC1B;AACA;AACA,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE;AAC1B,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACxC,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;AACvC,QAAQ;AACR,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChD,QAAQ,OAAO,IAAI;AACnB,MAAM,CAAC;AACP;AACA,MAAM,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE;AAC3B,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACvC,UAAU,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AAChD,UAAU,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC5C,UAAU,IAAI,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3C,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,MAAM,CAAC;AACP;AACA,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AACxB,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACvC,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI;AAClD,YAAY,IAAI;AAChB,cAAc,EAAE,CAAC,IAAI,CAAC;AACtB,YAAY,CAAC,CAAC,OAAO,GAAG,EAAE;AAC1B,cAAc,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC;AACtE,YAAY;AACZ,UAAU,CAAC,CAAC;AACZ,QAAQ;AACR,MAAM,CAAC;AACP;AACA,MAAM,WAAW,GAAG;AACpB,QAAQ,WAAW,CAAC,WAAW,CAAC;AAChC,MAAM;AACN,KAAK,CAAC;AACN;AACA,IAAI,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC;AAC1C,IAAI,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC;AACpD;AACA;AACA,IAAI,IAAI,eAAe,CAAC,KAAK,KAAK,gBAAgB,CAAC,SAAS,EAAE;AAC9D,MAAM,0BAA0B,CAAC,OAAO,CAAC;AACzC,IAAI;AACJ;AACA,IAAI,OAAO,OAAO;AAClB,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,eAAe,0BAA0B,CAAC,OAAO,EAAE;AACrD,IAAI,IAAI,eAAe,CAAC,KAAK,KAAK,gBAAgB,CAAC,SAAS,EAAE;AAC9D,MAAM;AACN,IAAI;AACJ;AACA,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI;AACpC;AACA;AACA,IAAI,IAAI,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;AAC7C,MAAM,WAAW,CAAC;AAClB,QAAQ,KAAK,EAAE,mBAAmB;AAClC,QAAQ,IAAI,EAAE;AACd,UAAU,OAAO,EAAE,OAAO,CAAC,IAAI;AAC/B,UAAU,OAAO,EAAE,MAAM,CAAC;AAC1B;AACA,OAAO,CAAC;AACR,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI,IAAI;AACR,MAAM,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC;AACjD,MAAM,WAAW,CAAC;AAClB,QAAQ,KAAK,EAAE,cAAc;AAC7B,QAAQ,IAAI,EAAE;AACd,OAAO,CAAC;AACR,IAAI,CAAC,CAAC,OAAO,GAAG,EAAE;AAClB,MAAM,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC;AACrD,MAAM,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO;AAC/B,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,eAAe,WAAW,CAAC,OAAO,EAAE;AACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACzB,MAAM,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;AAChD,IAAI;AACJ;AACA,IAAI,MAAM,QAAQ,GAAG;AACrB,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM;AAC5B,MAAM,OAAO,EAAE,OAAO,CAAC,IAAI;AAC3B,MAAM,SAAS,EAAE,QAAQ,CAAC;AAC1B,KAAK;AACL;AACA;AACA,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE;AACnC,MAAM,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS;AACpD,IAAI,CAAC,MAAM;AACX;AACA,MAAM,QAAQ,CAAC,SAAS,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC;AACxD,IAAI;AACJ;AACA;AACA,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;AACxE,MAAM,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI;AAC1C,IAAI;AACJ;AACA,IAAI,OAAO,QAAQ;AACnB,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,eAAe,cAAc,CAAC,OAAO,EAAE;AACzC,IAAI,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE;AACtD,MAAM,MAAM,EAAE,MAAM;AACpB,MAAM,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;AACrD,MAAM,WAAW,EAAE,SAAS;AAC5B,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;AAC3B,QAAQ,YAAY,EAAE,OAAO,CAAC,IAAI;AAClC,QAAQ,SAAS,EAAE,QAAQ,CAAC,KAAK;AACjC,QAAQ,OAAO,EAAE,MAAM,CAAC,MAAM;AAC9B,QAAQ,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;AACnC,OAAO;AACP,KAAK,CAAC;AACN;AACA,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AACtB,MAAM,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;AACvF,MAAM,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,yBAAyB,CAAC;AAC7D,IAAI;AACJ;AACA,IAAI,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AACtC,IAAI,OAAO,IAAI,CAAC,SAAS;AACzB,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,WAAW,CAAC,WAAW,EAAE;AACpC,IAAI,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,iBAAiB,CAAC,WAAW,CAAC;AAC7F,IAAI,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;AACjD;AACA,IAAI,IAAI,OAAO,EAAE;AACjB,MAAM,IAAI,OAAO,CAAC,UAAU,IAAI,eAAe,CAAC,KAAK,KAAK,gBAAgB,CAAC,SAAS,EAAE;AACtF,QAAQ,WAAW,CAAC;AACpB,UAAU,KAAK,EAAE,qBAAqB;AACtC,UAAU,IAAI,EAAE,EAAE,OAAO,EAAE,eAAe;AAC1C,SAAS,CAAC;AACV,MAAM;AACN;AACA,MAAM,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC;AACtC,MAAM,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC;AACxC,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,OAAO,CAAC,WAAW,EAAE;AAChC,IAAI,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,iBAAiB,CAAC,WAAW,CAAC;AAC7F,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;AACxC,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,WAAW,GAAG;AACzB,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK;AACpD,MAAM,IAAI,EAAE,EAAE,CAAC,YAAY;AAC3B,MAAM,QAAQ,EAAE,EAAE,CAAC,IAAI;AACvB,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI;AACnB,MAAM,UAAU,EAAE,EAAE,CAAC;AACrB,KAAK,CAAC,CAAC;AACP,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE;AAC/B,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACpC,MAAM,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;AACnC,IAAI;AACJ,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC5C,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE;AAChC,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACnC,MAAM,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5C,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AACxC,MAAM,IAAI,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACvC,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC7B,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACnC,MAAM,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI;AAC9C,QAAQ,IAAI;AACZ,UAAU,EAAE,CAAC,IAAI,CAAC;AAClB,QAAQ,CAAC,CAAC,OAAO,GAAG,EAAE;AACtB,UAAU,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC;AAC1D,QAAQ;AACR,MAAM,CAAC,CAAC;AACR,IAAI;AACJ,EAAE;AACF;AACA;AACA,EAAEE,eAAW,CAAC,MAAM;AACpB,IAAI,UAAU,EAAE;AAChB,EAAE,CAAC,CAAC;AACJ;AACA;AACA,EAAE,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE;AAC3C,IAAI,OAAO,EAAE;AACb,EAAE;AACF;AACA,EAAE,OAAO;AACT;AACA,IAAI,eAAe,EAAEC,YAAQ,CAAC,eAAe,CAAC;AAC9C,IAAI,QAAQ,EAAEA,YAAQ,CAAC,QAAQ,CAAC;AAChC,IAAI,KAAK,EAAEA,YAAQ,CAAC,KAAK,CAAC;AAC1B,IAAI,iBAAiB,EAAEA,YAAQ,CAAC,iBAAiB,CAAC;AAClD;AACA;AACA,IAAI,WAAW;AACf,IAAI,YAAY;AAChB,IAAI,cAAc;AAClB;AACA;AACA,IAAI,OAAO;AACX,IAAI,UAAU;AACd,IAAI,SAAS;AACb,IAAI,WAAW;AACf,IAAI,OAAO;AACX,IAAI,WAAW;AACf,IAAI,EAAE;AACN,IAAI,GAAG;AACP;AACA;AACA,IAAI,iBAAiB;AACrB,IAAI,kBAAkB;AACtB,IAAI,cAAc;AAClB;AACA;AACA,IAAI,gBAAgB;AACpB,IAAI,YAAY;AAChB,GAAG;AACH;;AC5lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,EAAE,EAAE;AACtE,EAAE,MAAM,OAAO,GAAGJ,OAAG,CAAC,IAAI,CAAC;AAC3B,EAAE,MAAM,YAAY,GAAGA,OAAG,CAAC,KAAK,CAAC;AACjC,EAAE,MAAM,SAAS,GAAGA,OAAG,CAAC,IAAI,CAAC;AAC7B,EAAE,MAAM,MAAM,GAAGC,YAAQ,CAAC,EAAE,CAAC;AAC7B,EAAE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAE;AACjC;AACA;AACA;AACA;AACA,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG;AAC5C;AACA;AACA;AACA;AACA,EAAE,SAAS,SAAS,GAAG;AACvB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE;AAClC;AACA,IAAI,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC;AAC3D;AACA;AACA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM;AACzC,MAAM,YAAY,CAAC,KAAK,GAAG,IAAI;AAC/B,IAAI,CAAC,CAAC;AACN;AACA,IAAI,OAAO,OAAO,CAAC,KAAK;AACxB,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,WAAW,GAAG;AACzB,IAAI,IAAI,OAAO,IAAI,WAAW,EAAE;AAChC,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC;AACtC,MAAM,OAAO,CAAC,KAAK,GAAG,IAAI;AAC1B,MAAM,YAAY,CAAC,KAAK,GAAG,KAAK;AAChC,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE;AACnC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACxB,MAAM,SAAS,EAAE;AACjB,IAAI;AACJ;AACA,IAAI,MAAM,OAAO,GAAG,CAAC,IAAI,KAAK;AAC9B;AACA,MAAM,SAAS,CAAC,KAAK,GAAG;AACxB,QAAQ,KAAK,EAAE,SAAS;AACxB,QAAQ,IAAI;AACZ,QAAQ,SAAS,EAAE,IAAI,IAAI;AAC3B,OAAO;AACP;AACA;AACA,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;AACrC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE;AACrC,QAAQ,MAAM,CAAC,GAAG,EAAE;AACpB,MAAM;AACN;AACA;AACA,MAAM,QAAQ,CAAC,IAAI,CAAC;AACpB,IAAI,CAAC;AACL;AACA,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;AACzC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;AACxC;AACA,IAAI,OAAO,MAAM,GAAG,CAAC,SAAS,CAAC;AAC/B,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE;AAC1B,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACvD,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAChE,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;AACrC,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE,SAAS,WAAW,GAAG;AACzB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;AACrB,IAAI,SAAS,CAAC,KAAK,GAAG,IAAI;AAC1B,EAAE;AACF;AACA;AACA,EAAE,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK,IAAI,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE;AACtE,IAAI,SAAS,EAAE;AACf,EAAE;AACF;AACA;AACA,EAAE,IAAI,OAAO,EAAE;AACf,IAAII,SAAK,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,SAAS,KAAK;AAC1D,MAAM,IAAI,SAAS,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAC1E,QAAQ,SAAS,EAAE;AACnB,MAAM;AACN,IAAI,CAAC,CAAC;AACN,EAAE;AACF;AACA;AACA,EAAEF,eAAW,CAAC,MAAM;AACpB,IAAI,WAAW,EAAE;AACjB,EAAE,CAAC,CAAC;AACJ;AACA,EAAE,OAAO;AACT,IAAI,OAAO;AACX,IAAI,YAAY;AAChB,IAAI,SAAS;AACb,IAAI,MAAM;AACV;AACA,IAAI,SAAS;AACb,IAAI,WAAW;AACf,IAAI,EAAE;AACN,IAAI,GAAG;AACP,IAAI,WAAW;AACf,GAAG;AACH;;ACpIA;AACA;AACA;AACY,MAAC,UAAU,GAAG,MAAM,CAAC,SAAS;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,aAAa,GAAG;AAC7B,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE;AAC7B;AACA,IAAI,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;AACvC;AACA;AACA,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC;AACpC;AACA;AACA,IAAI,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,GAAG,OAAO;AAClD;AACA;AACA,IAAI,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,GAAG,gBAAgB;AAC3E,IAAI,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,GAAG,YAAY;AACnE,EAAE;AACF;;AAEA;AACA;AACA;AACO,SAAS,kBAAkB,GAAG;AACrC,EAAE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AACpC,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,MAAM,IAAI,KAAK;AACnB,MAAM,2CAA2C;AACjD,MAAM;AACN,KAAK;AACL,EAAE;AACF,EAAE,OAAO,OAAO;AAChB;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;"}
|
package/dist/pushler-vue.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @pushler/vue v1.0.
|
|
2
|
+
* @pushler/vue v1.0.3
|
|
3
3
|
* (c) 2026 Pushler.ru
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
@@ -54,9 +54,11 @@ function usePushler(options = {}) {
|
|
|
54
54
|
const eventListeners = new Map();
|
|
55
55
|
|
|
56
56
|
// Конфигурация
|
|
57
|
+
const appKey = options.appKey || '';
|
|
57
58
|
const config = {
|
|
58
|
-
appKey:
|
|
59
|
-
|
|
59
|
+
appKey: appKey,
|
|
60
|
+
// wsUrl формируется автоматически из appKey, но можно переопределить
|
|
61
|
+
wsUrl: options.wsUrl || `wss://ws.pushler.ru/app/${appKey}`,
|
|
60
62
|
authEndpoint: options.authEndpoint || '/pushler/auth',
|
|
61
63
|
autoConnect: options.autoConnect || false,
|
|
62
64
|
reconnectDelay: options.reconnectDelay || 1000,
|
|
@@ -117,13 +119,9 @@ function usePushler(options = {}) {
|
|
|
117
119
|
error.value = null;
|
|
118
120
|
|
|
119
121
|
try {
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
: `${config.wsUrl}/${config.appKey}`;
|
|
124
|
-
|
|
125
|
-
console.log('[Pushler Vue] Connecting to:', wsUrl);
|
|
126
|
-
socket = new WebSocket(wsUrl);
|
|
122
|
+
// wsUrl уже содержит appKey из конфигурации
|
|
123
|
+
console.log('[Pushler Vue] Connecting to:', config.wsUrl);
|
|
124
|
+
socket = new WebSocket(config.wsUrl);
|
|
127
125
|
setupSocketHandlers();
|
|
128
126
|
} catch (err) {
|
|
129
127
|
console.error('[Pushler Vue] Connection error:', err);
|
|
@@ -764,7 +762,6 @@ const PushlerKey = Symbol('pushler');
|
|
|
764
762
|
* const app = createApp(App);
|
|
765
763
|
* app.use(PushlerPlugin, {
|
|
766
764
|
* appKey: 'your-app-key',
|
|
767
|
-
* wsUrl: 'wss://ws.pushler.ru/app',
|
|
768
765
|
* autoConnect: true
|
|
769
766
|
* });
|
|
770
767
|
* ```
|
|
@@ -820,8 +817,7 @@ function usePushlerInstance() {
|
|
|
820
817
|
* import { usePushler } from '@pushler/vue';
|
|
821
818
|
*
|
|
822
819
|
* const pushler = usePushler({
|
|
823
|
-
* appKey: 'your-app-key'
|
|
824
|
-
* wsUrl: 'wss://ws.pushler.ru/app'
|
|
820
|
+
* appKey: 'your-app-key'
|
|
825
821
|
* });
|
|
826
822
|
*
|
|
827
823
|
* // Подключение
|
|
@@ -851,7 +847,6 @@ function usePushlerInstance() {
|
|
|
851
847
|
* const app = createApp(App);
|
|
852
848
|
* app.use(PushlerPlugin, {
|
|
853
849
|
* appKey: 'your-app-key',
|
|
854
|
-
* wsUrl: 'wss://ws.pushler.ru/app',
|
|
855
850
|
* autoConnect: true
|
|
856
851
|
* });
|
|
857
852
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pushler-vue.esm.js","sources":["../src/usePushler.js","../src/usePushlerChannel.js","../src/plugin.js","../src/index.js"],"sourcesContent":["import { ref, reactive, readonly, onUnmounted, watch, computed } from 'vue';\n\n/**\n * Состояния подключения\n */\nexport const ConnectionStates = {\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n};\n\n/**\n * Типы каналов\n */\nexport const ChannelTypes = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PRESENCE: 'presence'\n};\n\n/**\n * Vue composable для работы с Pushler WebSocket\n * \n * @param {Object} options - Опции подключения\n * @param {string} options.appKey - Ключ приложения\n * @param {string} options.wsUrl - URL WebSocket сервера\n * @param {string} options.authEndpoint - Эндпоинт авторизации для приватных каналов\n * @param {boolean} options.autoConnect - Автоматическое подключение (по умолчанию false)\n * @param {number} options.reconnectDelay - Задержка переподключения в мс (по умолчанию 1000)\n * @param {number} options.maxReconnectAttempts - Максимум попыток переподключения (по умолчанию 5)\n * @returns {Object} Реактивный объект с методами и состоянием\n */\nexport function usePushler(options = {}) {\n // Реактивное состояние\n const connectionState = ref(ConnectionStates.DISCONNECTED);\n const socketId = ref(null);\n const error = ref(null);\n const reconnectAttempts = ref(0);\n \n // Каналы\n const channels = reactive(new Map());\n const channelAliases = reactive(new Map());\n \n // Внутренние переменные\n let socket = null;\n let reconnectTimer = null;\n const eventListeners = new Map();\n \n // Конфигурация\n const config = {\n appKey: options.appKey || '',\n wsUrl: options.wsUrl || 'wss://ws.pushler.ru/app',\n authEndpoint: options.authEndpoint || '/pushler/auth',\n autoConnect: options.autoConnect || false,\n reconnectDelay: options.reconnectDelay || 1000,\n maxReconnectAttempts: options.maxReconnectAttempts || 5,\n };\n \n // Вычисляемые свойства\n const isConnected = computed(() => connectionState.value === ConnectionStates.CONNECTED);\n const isConnecting = computed(() => connectionState.value === ConnectionStates.CONNECTING);\n const isReconnecting = computed(() => connectionState.value === ConnectionStates.RECONNECTING);\n \n /**\n * Форматирование имени канала с префиксом appKey\n */\n function formatChannelName(channelName) {\n if (channelName.startsWith(config.appKey + ':')) {\n return channelName;\n }\n return `${config.appKey}:${channelName}`;\n }\n \n /**\n * Извлечение оригинального имени канала\n */\n function extractChannelName(fullChannelName) {\n const prefix = config.appKey + ':';\n if (fullChannelName.startsWith(prefix)) {\n return fullChannelName.substring(prefix.length);\n }\n return fullChannelName;\n }\n \n /**\n * Определение типа канала\n */\n function getChannelType(channelName) {\n const baseName = extractChannelName(channelName);\n if (baseName.startsWith('private-')) return ChannelTypes.PRIVATE;\n if (baseName.startsWith('presence-')) return ChannelTypes.PRESENCE;\n return ChannelTypes.PUBLIC;\n }\n \n /**\n * Подключение к WebSocket серверу\n */\n function connect(connectOptions = {}) {\n // Обновляем конфигурацию если переданы новые параметры\n if (connectOptions.appKey) config.appKey = connectOptions.appKey;\n if (connectOptions.wsUrl) config.wsUrl = connectOptions.wsUrl;\n if (connectOptions.authEndpoint) config.authEndpoint = connectOptions.authEndpoint;\n \n if (connectionState.value === ConnectionStates.CONNECTED ||\n connectionState.value === ConnectionStates.CONNECTING) {\n return;\n }\n \n connectionState.value = ConnectionStates.CONNECTING;\n error.value = null;\n \n try {\n // Формируем URL с ключом приложения\n const wsUrl = config.wsUrl.endsWith('/') \n ? `${config.wsUrl}${config.appKey}`\n : `${config.wsUrl}/${config.appKey}`;\n \n console.log('[Pushler Vue] Connecting to:', wsUrl);\n socket = new WebSocket(wsUrl);\n setupSocketHandlers();\n } catch (err) {\n console.error('[Pushler Vue] Connection error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = err.message;\n }\n }\n \n /**\n * Настройка обработчиков WebSocket\n */\n function setupSocketHandlers() {\n socket.onopen = () => {\n console.log('[Pushler Vue] WebSocket opened, waiting for connection_established...');\n };\n \n socket.onmessage = (event) => {\n handleMessage(event);\n };\n \n socket.onclose = (event) => {\n console.log('[Pushler Vue] WebSocket closed:', event.code, event.reason);\n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n \n // Автопереподключение\n if (event.code !== 1000 && reconnectAttempts.value < config.maxReconnectAttempts) {\n scheduleReconnect();\n }\n };\n \n socket.onerror = (err) => {\n console.error('[Pushler Vue] WebSocket error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = 'Connection failed';\n };\n }\n \n /**\n * Обработка входящих сообщений\n */\n function handleMessage(event) {\n try {\n // Поддержка нескольких сообщений в одном event\n const messages = event.data.trim().split('\\n').filter(line => line.trim());\n \n for (const msgData of messages) {\n processMessage(JSON.parse(msgData));\n }\n } catch (err) {\n console.error('[Pushler Vue] Error parsing message:', err);\n }\n }\n \n /**\n * Обработка отдельного сообщения\n */\n function processMessage(message) {\n switch (message.event) {\n case 'pushler:connection_established':\n handleConnectionEstablished(message.data);\n break;\n case 'pushler:subscription_succeeded':\n handleSubscriptionSucceeded(message);\n break;\n case 'pushler:auth_success':\n handleAuthSuccess(message);\n break;\n case 'pushler:auth_error':\n handleAuthError(message);\n break;\n default:\n handleChannelMessage(message);\n }\n }\n \n /**\n * Обработка установления соединения\n */\n function handleConnectionEstablished(data) {\n socketId.value = data.socket_id;\n connectionState.value = ConnectionStates.CONNECTED;\n reconnectAttempts.value = 0;\n \n console.log('[Pushler Vue] Connected with socket ID:', socketId.value);\n \n // Переподписка на все каналы\n resubscribeAllChannels();\n \n emit('connected', { socketId: socketId.value });\n }\n \n /**\n * Переподписка на все каналы\n */\n function resubscribeAllChannels() {\n for (const [name, channel] of channels.entries()) {\n channel.subscribed = false;\n performChannelSubscription(channel);\n }\n }\n \n /**\n * Обработка успешной подписки\n */\n function handleSubscriptionSucceeded(message) {\n const channel = channels.get(message.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data || {});\n }\n }\n \n /**\n * Обработка успешной авторизации\n */\n function handleAuthSuccess(message) {\n const channel = channels.get(message.data.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data);\n }\n emit('auth_success', message.data);\n }\n \n /**\n * Обработка ошибки авторизации\n */\n function handleAuthError(message) {\n error.value = message.data.error;\n emit('auth_error', message.data);\n }\n \n /**\n * Обработка сообщения канала\n */\n function handleChannelMessage(message) {\n const { channel: channelName, event, data } = message;\n const channel = channels.get(channelName);\n \n if (channel) {\n channel.emit(event, data);\n }\n \n emit('message', { \n channel: extractChannelName(channelName), \n event, \n data \n });\n }\n \n /**\n * Планирование переподключения\n */\n function scheduleReconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n }\n \n reconnectAttempts.value++;\n connectionState.value = ConnectionStates.RECONNECTING;\n \n const delay = config.reconnectDelay * reconnectAttempts.value;\n console.log(`[Pushler Vue] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${config.maxReconnectAttempts})`);\n \n reconnectTimer = setTimeout(() => {\n connect();\n }, delay);\n }\n \n /**\n * Отключение от сервера\n */\n function disconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n \n if (socket) {\n socket.close(1000, 'User disconnect');\n socket = null;\n }\n \n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n channels.clear();\n channelAliases.clear();\n reconnectAttempts.value = 0;\n \n emit('disconnected');\n }\n \n /**\n * Отправка сообщения через WebSocket\n */\n function sendMessage(message) {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n \n /**\n * Подписка на канал\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции (signature для приватных, user для presence)\n * @returns {Object} Реактивный объект канала\n */\n function subscribe(channelName, subscribeOptions = {}) {\n const fullChannelName = formatChannelName(channelName);\n \n if (channels.has(fullChannelName)) {\n return channels.get(fullChannelName);\n }\n \n // Создаем реактивный канал\n const channel = reactive({\n name: fullChannelName,\n originalName: channelName,\n type: getChannelType(channelName),\n subscribed: false,\n options: subscribeOptions,\n listeners: new Map(),\n \n // Методы канала\n on(event, callback) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event).push(callback);\n return this;\n },\n \n off(event, callback) {\n if (this.listeners.has(event)) {\n const list = this.listeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n return this;\n },\n \n emit(event, data) {\n if (this.listeners.has(event)) {\n this.listeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Channel event error:', err);\n }\n });\n }\n },\n \n unsubscribe() {\n unsubscribe(channelName);\n }\n });\n \n channels.set(fullChannelName, channel);\n channelAliases.set(channelName, fullChannelName);\n \n // Подписываемся если уже подключены\n if (connectionState.value === ConnectionStates.CONNECTED) {\n performChannelSubscription(channel);\n }\n \n return channel;\n }\n \n /**\n * Выполнение подписки на канал\n */\n async function performChannelSubscription(channel) {\n if (connectionState.value !== ConnectionStates.CONNECTED) {\n return;\n }\n \n const channelType = channel.type;\n \n // Публичные каналы\n if (channelType === ChannelTypes.PUBLIC) {\n sendMessage({\n event: 'pushler:subscribe',\n data: {\n channel: channel.name,\n app_key: config.appKey\n }\n });\n return;\n }\n \n // Приватные и presence каналы требуют авторизации\n try {\n const authData = await getAuthData(channel);\n sendMessage({\n event: 'pushler:auth',\n data: authData\n });\n } catch (err) {\n console.error('[Pushler Vue] Auth error:', err);\n error.value = err.message;\n }\n }\n \n /**\n * Получение данных авторизации для приватных/presence каналов\n * \n * Для приватных каналов подпись ДОЛЖНА быть получена с вашего бэкенда,\n * либо передана в options.signature при подписке.\n * \n * НИКОГДА не храните секретный ключ в клиентском коде!\n */\n async function getAuthData(channel) {\n if (!socketId.value) {\n throw new Error('Socket ID not available');\n }\n \n const authData = {\n app_key: config.appKey,\n channel: channel.name,\n socket_id: socketId.value\n };\n \n // Если подпись уже предоставлена в options\n if (channel.options.signature) {\n authData.signature = channel.options.signature;\n } else {\n // Запрашиваем подпись с бэкенда\n authData.signature = await fetchSignature(channel);\n }\n \n // Данные пользователя для presence каналов\n if (channel.type === ChannelTypes.PRESENCE && channel.options.user) {\n authData.user = channel.options.user;\n }\n \n return authData;\n }\n \n /**\n * Запрос подписи с бэкенда\n * \n * Ваш бэкенд должен:\n * 1. Проверить авторизацию пользователя\n * 2. Сгенерировать HMAC-SHA256 подпись с секретным ключом\n * 3. Вернуть подпись клиенту\n */\n async function fetchSignature(channel) {\n const response = await fetch(config.authEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Включаем куки для авторизации\n body: JSON.stringify({\n channel_name: channel.name,\n socket_id: socketId.value,\n app_key: config.appKey,\n user_data: channel.options.user\n })\n });\n \n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Auth request failed' }));\n throw new Error(err.error || 'Failed to get signature');\n }\n \n const data = await response.json();\n return data.signature;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n const channel = channels.get(fullChannelName);\n \n if (channel) {\n if (channel.subscribed && connectionState.value === ConnectionStates.CONNECTED) {\n sendMessage({\n event: 'pushler:unsubscribe',\n data: { channel: fullChannelName }\n });\n }\n \n channels.delete(fullChannelName);\n channelAliases.delete(channelName);\n }\n }\n \n /**\n * Получение канала по имени\n */\n function channel(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n return channels.get(fullChannelName);\n }\n \n /**\n * Получение списка каналов\n */\n function getChannels() {\n return Array.from(channels.values()).map(ch => ({\n name: ch.originalName,\n fullName: ch.name,\n type: ch.type,\n subscribed: ch.subscribed\n }));\n }\n \n /**\n * Подписка на глобальное событие\n */\n function on(event, callback) {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, []);\n }\n eventListeners.get(event).push(callback);\n }\n \n /**\n * Отписка от глобального события\n */\n function off(event, callback) {\n if (eventListeners.has(event)) {\n const list = eventListeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n }\n \n /**\n * Вызов глобального события\n */\n function emit(event, data) {\n if (eventListeners.has(event)) {\n eventListeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Event error:', err);\n }\n });\n }\n }\n \n // Автоматическое отключение при размонтировании компонента\n onUnmounted(() => {\n disconnect();\n });\n \n // Автоподключение если указано\n if (config.autoConnect && config.appKey) {\n connect();\n }\n \n return {\n // Состояние (readonly для защиты от внешних изменений)\n connectionState: readonly(connectionState),\n socketId: readonly(socketId),\n error: readonly(error),\n reconnectAttempts: readonly(reconnectAttempts),\n \n // Вычисляемые свойства\n isConnected,\n isConnecting,\n isReconnecting,\n \n // Методы\n connect,\n disconnect,\n subscribe,\n unsubscribe,\n channel,\n getChannels,\n on,\n off,\n \n // Утилиты\n formatChannelName,\n extractChannelName,\n getChannelType,\n \n // Константы\n ConnectionStates,\n ChannelTypes,\n };\n}\n\nexport default usePushler;\n","import { ref, reactive, onUnmounted, watch } from 'vue';\n\n/**\n * Vue composable для работы с отдельным каналом Pushler\n * \n * Можно использовать автономно или совместно с usePushler\n * \n * @param {Object} pushler - Инстанс usePushler\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции канала\n * @returns {Object} Реактивный объект канала с событиями\n */\nexport function usePushlerChannel(pushler, channelName, options = {}) {\n const channel = ref(null);\n const isSubscribed = ref(false);\n const lastEvent = ref(null);\n const events = reactive([]);\n const eventHandlers = new Map();\n \n /**\n * Максимальное количество событий в буфере\n */\n const maxEvents = options.maxEvents || 100;\n \n /**\n * Подписка на канал\n */\n function subscribe() {\n if (!pushler || !channelName) return;\n \n channel.value = pushler.subscribe(channelName, options);\n \n // Отслеживаем статус подписки\n channel.value.on('subscribed', () => {\n isSubscribed.value = true;\n });\n \n return channel.value;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe() {\n if (pushler && channelName) {\n pushler.unsubscribe(channelName);\n channel.value = null;\n isSubscribed.value = false;\n }\n }\n \n /**\n * Подписка на событие канала\n * @param {string} eventName - Имя события\n * @param {Function} callback - Обработчик\n */\n function on(eventName, callback) {\n if (!channel.value) {\n subscribe();\n }\n \n const handler = (data) => {\n // Сохраняем последнее событие\n lastEvent.value = {\n event: eventName,\n data,\n timestamp: new Date()\n };\n \n // Добавляем в буфер событий\n events.unshift(lastEvent.value);\n if (events.length > maxEvents) {\n events.pop();\n }\n \n // Вызываем пользовательский обработчик\n callback(data);\n };\n \n eventHandlers.set(eventName, handler);\n channel.value.on(eventName, handler);\n \n return () => off(eventName);\n }\n \n /**\n * Отписка от события канала\n */\n function off(eventName) {\n if (channel.value && eventHandlers.has(eventName)) {\n channel.value.off(eventName, eventHandlers.get(eventName));\n eventHandlers.delete(eventName);\n }\n }\n \n /**\n * Очистка буфера событий\n */\n function clearEvents() {\n events.length = 0;\n lastEvent.value = null;\n }\n \n // Автоматическая подписка если указано\n if (options.autoSubscribe !== false && pushler?.isConnected?.value) {\n subscribe();\n }\n \n // Подписываемся при подключении\n if (pushler) {\n watch(() => pushler.isConnected.value, (connected) => {\n if (connected && options.autoSubscribe !== false && !channel.value) {\n subscribe();\n }\n });\n }\n \n // Автоматическая отписка при размонтировании\n onUnmounted(() => {\n unsubscribe();\n });\n \n return {\n channel,\n isSubscribed,\n lastEvent,\n events,\n \n subscribe,\n unsubscribe,\n on,\n off,\n clearEvents,\n };\n}\n\nexport default usePushlerChannel;\n","import { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\n\n/**\n * Символ для инъекции Pushler\n */\nexport const PushlerKey = Symbol('pushler');\n\n/**\n * Vue Plugin для глобальной инициализации Pushler\n * \n * Использование:\n * \n * ```js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app',\n * autoConnect: true\n * });\n * ```\n * \n * Затем в компонентах:\n * \n * ```js\n * import { inject } from 'vue';\n * import { PushlerKey } from '@pushler/vue';\n * \n * const pushler = inject(PushlerKey);\n * ```\n */\nexport const PushlerPlugin = {\n install(app, options = {}) {\n // Создаем глобальный инстанс Pushler\n const pushler = usePushler(options);\n \n // Предоставляем через provide/inject\n app.provide(PushlerKey, pushler);\n \n // Также добавляем как глобальное свойство (для Options API)\n app.config.globalProperties.$pushler = pushler;\n \n // Экспортируем константы\n app.config.globalProperties.$PushlerConnectionStates = ConnectionStates;\n app.config.globalProperties.$PushlerChannelTypes = ChannelTypes;\n }\n};\n\n/**\n * Хелпер для получения инстанса Pushler в setup()\n */\nexport function usePushlerInstance() {\n const pushler = inject(PushlerKey);\n if (!pushler) {\n throw new Error(\n '[Pushler Vue] No Pushler instance found. ' +\n 'Make sure to install PushlerPlugin or provide a Pushler instance.'\n );\n }\n return pushler;\n}\n\nexport default PushlerPlugin;\n","/**\n * Pushler Vue SDK\n * \n * Реактивный Vue.js SDK для работы с Pushler.ru WebSocket сервером\n * \n * @example Базовое использование\n * ```vue\n * <script setup>\n * import { usePushler } from '@pushler/vue';\n * \n * const pushler = usePushler({\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app'\n * });\n * \n * // Подключение\n * pushler.connect();\n * \n * // Подписка на канал\n * const channel = pushler.subscribe('my-channel');\n * channel.on('message', (data) => {\n * console.log('Received:', data);\n * });\n * </script>\n * \n * <template>\n * <div>\n * <p>Status: {{ pushler.connectionState }}</p>\n * <p>Socket ID: {{ pushler.socketId }}</p>\n * </div>\n * </template>\n * ```\n * \n * @example С Vue Plugin\n * ```js\n * // main.js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app',\n * autoConnect: true\n * });\n * ```\n */\n\n// Основные composables\nexport { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\nexport { usePushlerChannel } from './usePushlerChannel';\n\n// Plugin\nexport { PushlerPlugin, PushlerKey, usePushlerInstance } from './plugin';\n\n// Default export\nimport { usePushler } from './usePushler';\nexport default usePushler;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pushler-vue.esm.js","sources":["../src/usePushler.js","../src/usePushlerChannel.js","../src/plugin.js","../src/index.js"],"sourcesContent":["import { ref, reactive, readonly, onUnmounted, watch, computed } from 'vue';\n\n/**\n * Состояния подключения\n */\nexport const ConnectionStates = {\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n};\n\n/**\n * Типы каналов\n */\nexport const ChannelTypes = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PRESENCE: 'presence'\n};\n\n/**\n * Vue composable для работы с Pushler WebSocket\n * \n * @param {Object} options - Опции подключения\n * @param {string} options.appKey - Ключ приложения\n * @param {string} options.wsUrl - URL WebSocket сервера\n * @param {string} options.authEndpoint - Эндпоинт авторизации для приватных каналов\n * @param {boolean} options.autoConnect - Автоматическое подключение (по умолчанию false)\n * @param {number} options.reconnectDelay - Задержка переподключения в мс (по умолчанию 1000)\n * @param {number} options.maxReconnectAttempts - Максимум попыток переподключения (по умолчанию 5)\n * @returns {Object} Реактивный объект с методами и состоянием\n */\nexport function usePushler(options = {}) {\n // Реактивное состояние\n const connectionState = ref(ConnectionStates.DISCONNECTED);\n const socketId = ref(null);\n const error = ref(null);\n const reconnectAttempts = ref(0);\n \n // Каналы\n const channels = reactive(new Map());\n const channelAliases = reactive(new Map());\n \n // Внутренние переменные\n let socket = null;\n let reconnectTimer = null;\n const eventListeners = new Map();\n \n // Конфигурация\n const appKey = options.appKey || '';\n const config = {\n appKey: appKey,\n // wsUrl формируется автоматически из appKey, но можно переопределить\n wsUrl: options.wsUrl || `wss://ws.pushler.ru/app/${appKey}`,\n authEndpoint: options.authEndpoint || '/pushler/auth',\n autoConnect: options.autoConnect || false,\n reconnectDelay: options.reconnectDelay || 1000,\n maxReconnectAttempts: options.maxReconnectAttempts || 5,\n };\n \n // Вычисляемые свойства\n const isConnected = computed(() => connectionState.value === ConnectionStates.CONNECTED);\n const isConnecting = computed(() => connectionState.value === ConnectionStates.CONNECTING);\n const isReconnecting = computed(() => connectionState.value === ConnectionStates.RECONNECTING);\n \n /**\n * Форматирование имени канала с префиксом appKey\n */\n function formatChannelName(channelName) {\n if (channelName.startsWith(config.appKey + ':')) {\n return channelName;\n }\n return `${config.appKey}:${channelName}`;\n }\n \n /**\n * Извлечение оригинального имени канала\n */\n function extractChannelName(fullChannelName) {\n const prefix = config.appKey + ':';\n if (fullChannelName.startsWith(prefix)) {\n return fullChannelName.substring(prefix.length);\n }\n return fullChannelName;\n }\n \n /**\n * Определение типа канала\n */\n function getChannelType(channelName) {\n const baseName = extractChannelName(channelName);\n if (baseName.startsWith('private-')) return ChannelTypes.PRIVATE;\n if (baseName.startsWith('presence-')) return ChannelTypes.PRESENCE;\n return ChannelTypes.PUBLIC;\n }\n \n /**\n * Подключение к WebSocket серверу\n */\n function connect(connectOptions = {}) {\n // Обновляем конфигурацию если переданы новые параметры\n if (connectOptions.appKey) config.appKey = connectOptions.appKey;\n if (connectOptions.wsUrl) config.wsUrl = connectOptions.wsUrl;\n if (connectOptions.authEndpoint) config.authEndpoint = connectOptions.authEndpoint;\n \n if (connectionState.value === ConnectionStates.CONNECTED ||\n connectionState.value === ConnectionStates.CONNECTING) {\n return;\n }\n \n connectionState.value = ConnectionStates.CONNECTING;\n error.value = null;\n \n try {\n // wsUrl уже содержит appKey из конфигурации\n console.log('[Pushler Vue] Connecting to:', config.wsUrl);\n socket = new WebSocket(config.wsUrl);\n setupSocketHandlers();\n } catch (err) {\n console.error('[Pushler Vue] Connection error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = err.message;\n }\n }\n \n /**\n * Настройка обработчиков WebSocket\n */\n function setupSocketHandlers() {\n socket.onopen = () => {\n console.log('[Pushler Vue] WebSocket opened, waiting for connection_established...');\n };\n \n socket.onmessage = (event) => {\n handleMessage(event);\n };\n \n socket.onclose = (event) => {\n console.log('[Pushler Vue] WebSocket closed:', event.code, event.reason);\n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n \n // Автопереподключение\n if (event.code !== 1000 && reconnectAttempts.value < config.maxReconnectAttempts) {\n scheduleReconnect();\n }\n };\n \n socket.onerror = (err) => {\n console.error('[Pushler Vue] WebSocket error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = 'Connection failed';\n };\n }\n \n /**\n * Обработка входящих сообщений\n */\n function handleMessage(event) {\n try {\n // Поддержка нескольких сообщений в одном event\n const messages = event.data.trim().split('\\n').filter(line => line.trim());\n \n for (const msgData of messages) {\n processMessage(JSON.parse(msgData));\n }\n } catch (err) {\n console.error('[Pushler Vue] Error parsing message:', err);\n }\n }\n \n /**\n * Обработка отдельного сообщения\n */\n function processMessage(message) {\n switch (message.event) {\n case 'pushler:connection_established':\n handleConnectionEstablished(message.data);\n break;\n case 'pushler:subscription_succeeded':\n handleSubscriptionSucceeded(message);\n break;\n case 'pushler:auth_success':\n handleAuthSuccess(message);\n break;\n case 'pushler:auth_error':\n handleAuthError(message);\n break;\n default:\n handleChannelMessage(message);\n }\n }\n \n /**\n * Обработка установления соединения\n */\n function handleConnectionEstablished(data) {\n socketId.value = data.socket_id;\n connectionState.value = ConnectionStates.CONNECTED;\n reconnectAttempts.value = 0;\n \n console.log('[Pushler Vue] Connected with socket ID:', socketId.value);\n \n // Переподписка на все каналы\n resubscribeAllChannels();\n \n emit('connected', { socketId: socketId.value });\n }\n \n /**\n * Переподписка на все каналы\n */\n function resubscribeAllChannels() {\n for (const [name, channel] of channels.entries()) {\n channel.subscribed = false;\n performChannelSubscription(channel);\n }\n }\n \n /**\n * Обработка успешной подписки\n */\n function handleSubscriptionSucceeded(message) {\n const channel = channels.get(message.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data || {});\n }\n }\n \n /**\n * Обработка успешной авторизации\n */\n function handleAuthSuccess(message) {\n const channel = channels.get(message.data.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data);\n }\n emit('auth_success', message.data);\n }\n \n /**\n * Обработка ошибки авторизации\n */\n function handleAuthError(message) {\n error.value = message.data.error;\n emit('auth_error', message.data);\n }\n \n /**\n * Обработка сообщения канала\n */\n function handleChannelMessage(message) {\n const { channel: channelName, event, data } = message;\n const channel = channels.get(channelName);\n \n if (channel) {\n channel.emit(event, data);\n }\n \n emit('message', { \n channel: extractChannelName(channelName), \n event, \n data \n });\n }\n \n /**\n * Планирование переподключения\n */\n function scheduleReconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n }\n \n reconnectAttempts.value++;\n connectionState.value = ConnectionStates.RECONNECTING;\n \n const delay = config.reconnectDelay * reconnectAttempts.value;\n console.log(`[Pushler Vue] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${config.maxReconnectAttempts})`);\n \n reconnectTimer = setTimeout(() => {\n connect();\n }, delay);\n }\n \n /**\n * Отключение от сервера\n */\n function disconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n \n if (socket) {\n socket.close(1000, 'User disconnect');\n socket = null;\n }\n \n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n channels.clear();\n channelAliases.clear();\n reconnectAttempts.value = 0;\n \n emit('disconnected');\n }\n \n /**\n * Отправка сообщения через WebSocket\n */\n function sendMessage(message) {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n \n /**\n * Подписка на канал\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции (signature для приватных, user для presence)\n * @returns {Object} Реактивный объект канала\n */\n function subscribe(channelName, subscribeOptions = {}) {\n const fullChannelName = formatChannelName(channelName);\n \n if (channels.has(fullChannelName)) {\n return channels.get(fullChannelName);\n }\n \n // Создаем реактивный канал\n const channel = reactive({\n name: fullChannelName,\n originalName: channelName,\n type: getChannelType(channelName),\n subscribed: false,\n options: subscribeOptions,\n listeners: new Map(),\n \n // Методы канала\n on(event, callback) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event).push(callback);\n return this;\n },\n \n off(event, callback) {\n if (this.listeners.has(event)) {\n const list = this.listeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n return this;\n },\n \n emit(event, data) {\n if (this.listeners.has(event)) {\n this.listeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Channel event error:', err);\n }\n });\n }\n },\n \n unsubscribe() {\n unsubscribe(channelName);\n }\n });\n \n channels.set(fullChannelName, channel);\n channelAliases.set(channelName, fullChannelName);\n \n // Подписываемся если уже подключены\n if (connectionState.value === ConnectionStates.CONNECTED) {\n performChannelSubscription(channel);\n }\n \n return channel;\n }\n \n /**\n * Выполнение подписки на канал\n */\n async function performChannelSubscription(channel) {\n if (connectionState.value !== ConnectionStates.CONNECTED) {\n return;\n }\n \n const channelType = channel.type;\n \n // Публичные каналы\n if (channelType === ChannelTypes.PUBLIC) {\n sendMessage({\n event: 'pushler:subscribe',\n data: {\n channel: channel.name,\n app_key: config.appKey\n }\n });\n return;\n }\n \n // Приватные и presence каналы требуют авторизации\n try {\n const authData = await getAuthData(channel);\n sendMessage({\n event: 'pushler:auth',\n data: authData\n });\n } catch (err) {\n console.error('[Pushler Vue] Auth error:', err);\n error.value = err.message;\n }\n }\n \n /**\n * Получение данных авторизации для приватных/presence каналов\n * \n * Для приватных каналов подпись ДОЛЖНА быть получена с вашего бэкенда,\n * либо передана в options.signature при подписке.\n * \n * НИКОГДА не храните секретный ключ в клиентском коде!\n */\n async function getAuthData(channel) {\n if (!socketId.value) {\n throw new Error('Socket ID not available');\n }\n \n const authData = {\n app_key: config.appKey,\n channel: channel.name,\n socket_id: socketId.value\n };\n \n // Если подпись уже предоставлена в options\n if (channel.options.signature) {\n authData.signature = channel.options.signature;\n } else {\n // Запрашиваем подпись с бэкенда\n authData.signature = await fetchSignature(channel);\n }\n \n // Данные пользователя для presence каналов\n if (channel.type === ChannelTypes.PRESENCE && channel.options.user) {\n authData.user = channel.options.user;\n }\n \n return authData;\n }\n \n /**\n * Запрос подписи с бэкенда\n * \n * Ваш бэкенд должен:\n * 1. Проверить авторизацию пользователя\n * 2. Сгенерировать HMAC-SHA256 подпись с секретным ключом\n * 3. Вернуть подпись клиенту\n */\n async function fetchSignature(channel) {\n const response = await fetch(config.authEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Включаем куки для авторизации\n body: JSON.stringify({\n channel_name: channel.name,\n socket_id: socketId.value,\n app_key: config.appKey,\n user_data: channel.options.user\n })\n });\n \n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Auth request failed' }));\n throw new Error(err.error || 'Failed to get signature');\n }\n \n const data = await response.json();\n return data.signature;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n const channel = channels.get(fullChannelName);\n \n if (channel) {\n if (channel.subscribed && connectionState.value === ConnectionStates.CONNECTED) {\n sendMessage({\n event: 'pushler:unsubscribe',\n data: { channel: fullChannelName }\n });\n }\n \n channels.delete(fullChannelName);\n channelAliases.delete(channelName);\n }\n }\n \n /**\n * Получение канала по имени\n */\n function channel(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n return channels.get(fullChannelName);\n }\n \n /**\n * Получение списка каналов\n */\n function getChannels() {\n return Array.from(channels.values()).map(ch => ({\n name: ch.originalName,\n fullName: ch.name,\n type: ch.type,\n subscribed: ch.subscribed\n }));\n }\n \n /**\n * Подписка на глобальное событие\n */\n function on(event, callback) {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, []);\n }\n eventListeners.get(event).push(callback);\n }\n \n /**\n * Отписка от глобального события\n */\n function off(event, callback) {\n if (eventListeners.has(event)) {\n const list = eventListeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n }\n \n /**\n * Вызов глобального события\n */\n function emit(event, data) {\n if (eventListeners.has(event)) {\n eventListeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Event error:', err);\n }\n });\n }\n }\n \n // Автоматическое отключение при размонтировании компонента\n onUnmounted(() => {\n disconnect();\n });\n \n // Автоподключение если указано\n if (config.autoConnect && config.appKey) {\n connect();\n }\n \n return {\n // Состояние (readonly для защиты от внешних изменений)\n connectionState: readonly(connectionState),\n socketId: readonly(socketId),\n error: readonly(error),\n reconnectAttempts: readonly(reconnectAttempts),\n \n // Вычисляемые свойства\n isConnected,\n isConnecting,\n isReconnecting,\n \n // Методы\n connect,\n disconnect,\n subscribe,\n unsubscribe,\n channel,\n getChannels,\n on,\n off,\n \n // Утилиты\n formatChannelName,\n extractChannelName,\n getChannelType,\n \n // Константы\n ConnectionStates,\n ChannelTypes,\n };\n}\n\nexport default usePushler;\n","import { ref, reactive, onUnmounted, watch } from 'vue';\n\n/**\n * Vue composable для работы с отдельным каналом Pushler\n * \n * Можно использовать автономно или совместно с usePushler\n * \n * @param {Object} pushler - Инстанс usePushler\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции канала\n * @returns {Object} Реактивный объект канала с событиями\n */\nexport function usePushlerChannel(pushler, channelName, options = {}) {\n const channel = ref(null);\n const isSubscribed = ref(false);\n const lastEvent = ref(null);\n const events = reactive([]);\n const eventHandlers = new Map();\n \n /**\n * Максимальное количество событий в буфере\n */\n const maxEvents = options.maxEvents || 100;\n \n /**\n * Подписка на канал\n */\n function subscribe() {\n if (!pushler || !channelName) return;\n \n channel.value = pushler.subscribe(channelName, options);\n \n // Отслеживаем статус подписки\n channel.value.on('subscribed', () => {\n isSubscribed.value = true;\n });\n \n return channel.value;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe() {\n if (pushler && channelName) {\n pushler.unsubscribe(channelName);\n channel.value = null;\n isSubscribed.value = false;\n }\n }\n \n /**\n * Подписка на событие канала\n * @param {string} eventName - Имя события\n * @param {Function} callback - Обработчик\n */\n function on(eventName, callback) {\n if (!channel.value) {\n subscribe();\n }\n \n const handler = (data) => {\n // Сохраняем последнее событие\n lastEvent.value = {\n event: eventName,\n data,\n timestamp: new Date()\n };\n \n // Добавляем в буфер событий\n events.unshift(lastEvent.value);\n if (events.length > maxEvents) {\n events.pop();\n }\n \n // Вызываем пользовательский обработчик\n callback(data);\n };\n \n eventHandlers.set(eventName, handler);\n channel.value.on(eventName, handler);\n \n return () => off(eventName);\n }\n \n /**\n * Отписка от события канала\n */\n function off(eventName) {\n if (channel.value && eventHandlers.has(eventName)) {\n channel.value.off(eventName, eventHandlers.get(eventName));\n eventHandlers.delete(eventName);\n }\n }\n \n /**\n * Очистка буфера событий\n */\n function clearEvents() {\n events.length = 0;\n lastEvent.value = null;\n }\n \n // Автоматическая подписка если указано\n if (options.autoSubscribe !== false && pushler?.isConnected?.value) {\n subscribe();\n }\n \n // Подписываемся при подключении\n if (pushler) {\n watch(() => pushler.isConnected.value, (connected) => {\n if (connected && options.autoSubscribe !== false && !channel.value) {\n subscribe();\n }\n });\n }\n \n // Автоматическая отписка при размонтировании\n onUnmounted(() => {\n unsubscribe();\n });\n \n return {\n channel,\n isSubscribed,\n lastEvent,\n events,\n \n subscribe,\n unsubscribe,\n on,\n off,\n clearEvents,\n };\n}\n\nexport default usePushlerChannel;\n","import { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\n\n/**\n * Символ для инъекции Pushler\n */\nexport const PushlerKey = Symbol('pushler');\n\n/**\n * Vue Plugin для глобальной инициализации Pushler\n * \n * Использование:\n * \n * ```js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * autoConnect: true\n * });\n * ```\n * \n * Затем в компонентах:\n * \n * ```js\n * import { inject } from 'vue';\n * import { PushlerKey } from '@pushler/vue';\n * \n * const pushler = inject(PushlerKey);\n * ```\n */\nexport const PushlerPlugin = {\n install(app, options = {}) {\n // Создаем глобальный инстанс Pushler\n const pushler = usePushler(options);\n \n // Предоставляем через provide/inject\n app.provide(PushlerKey, pushler);\n \n // Также добавляем как глобальное свойство (для Options API)\n app.config.globalProperties.$pushler = pushler;\n \n // Экспортируем константы\n app.config.globalProperties.$PushlerConnectionStates = ConnectionStates;\n app.config.globalProperties.$PushlerChannelTypes = ChannelTypes;\n }\n};\n\n/**\n * Хелпер для получения инстанса Pushler в setup()\n */\nexport function usePushlerInstance() {\n const pushler = inject(PushlerKey);\n if (!pushler) {\n throw new Error(\n '[Pushler Vue] No Pushler instance found. ' +\n 'Make sure to install PushlerPlugin or provide a Pushler instance.'\n );\n }\n return pushler;\n}\n\nexport default PushlerPlugin;\n","/**\n * Pushler Vue SDK\n * \n * Реактивный Vue.js SDK для работы с Pushler.ru WebSocket сервером\n * \n * @example Базовое использование\n * ```vue\n * <script setup>\n * import { usePushler } from '@pushler/vue';\n * \n * const pushler = usePushler({\n * appKey: 'your-app-key'\n * });\n * \n * // Подключение\n * pushler.connect();\n * \n * // Подписка на канал\n * const channel = pushler.subscribe('my-channel');\n * channel.on('message', (data) => {\n * console.log('Received:', data);\n * });\n * </script>\n * \n * <template>\n * <div>\n * <p>Status: {{ pushler.connectionState }}</p>\n * <p>Socket ID: {{ pushler.socketId }}</p>\n * </div>\n * </template>\n * ```\n * \n * @example С Vue Plugin\n * ```js\n * // main.js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * autoConnect: true\n * });\n * ```\n */\n\n// Основные composables\nexport { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\nexport { usePushlerChannel } from './usePushlerChannel';\n\n// Plugin\nexport { PushlerPlugin, PushlerKey, usePushlerInstance } from './plugin';\n\n// Default export\nimport { usePushler } from './usePushler';\nexport default usePushler;\n"],"names":[],"mappings":"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"}
|
package/dist/pushler-vue.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @pushler/vue v1.0.
|
|
2
|
+
* @pushler/vue v1.0.3
|
|
3
3
|
* (c) 2026 Pushler.ru
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
@@ -58,9 +58,11 @@
|
|
|
58
58
|
const eventListeners = new Map();
|
|
59
59
|
|
|
60
60
|
// Конфигурация
|
|
61
|
+
const appKey = options.appKey || '';
|
|
61
62
|
const config = {
|
|
62
|
-
appKey:
|
|
63
|
-
|
|
63
|
+
appKey: appKey,
|
|
64
|
+
// wsUrl формируется автоматически из appKey, но можно переопределить
|
|
65
|
+
wsUrl: options.wsUrl || `wss://ws.pushler.ru/app/${appKey}`,
|
|
64
66
|
authEndpoint: options.authEndpoint || '/pushler/auth',
|
|
65
67
|
autoConnect: options.autoConnect || false,
|
|
66
68
|
reconnectDelay: options.reconnectDelay || 1000,
|
|
@@ -121,13 +123,9 @@
|
|
|
121
123
|
error.value = null;
|
|
122
124
|
|
|
123
125
|
try {
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
: `${config.wsUrl}/${config.appKey}`;
|
|
128
|
-
|
|
129
|
-
console.log('[Pushler Vue] Connecting to:', wsUrl);
|
|
130
|
-
socket = new WebSocket(wsUrl);
|
|
126
|
+
// wsUrl уже содержит appKey из конфигурации
|
|
127
|
+
console.log('[Pushler Vue] Connecting to:', config.wsUrl);
|
|
128
|
+
socket = new WebSocket(config.wsUrl);
|
|
131
129
|
setupSocketHandlers();
|
|
132
130
|
} catch (err) {
|
|
133
131
|
console.error('[Pushler Vue] Connection error:', err);
|
|
@@ -768,7 +766,6 @@
|
|
|
768
766
|
* const app = createApp(App);
|
|
769
767
|
* app.use(PushlerPlugin, {
|
|
770
768
|
* appKey: 'your-app-key',
|
|
771
|
-
* wsUrl: 'wss://ws.pushler.ru/app',
|
|
772
769
|
* autoConnect: true
|
|
773
770
|
* });
|
|
774
771
|
* ```
|
|
@@ -824,8 +821,7 @@
|
|
|
824
821
|
* import { usePushler } from '@pushler/vue';
|
|
825
822
|
*
|
|
826
823
|
* const pushler = usePushler({
|
|
827
|
-
* appKey: 'your-app-key'
|
|
828
|
-
* wsUrl: 'wss://ws.pushler.ru/app'
|
|
824
|
+
* appKey: 'your-app-key'
|
|
829
825
|
* });
|
|
830
826
|
*
|
|
831
827
|
* // Подключение
|
|
@@ -855,7 +851,6 @@
|
|
|
855
851
|
* const app = createApp(App);
|
|
856
852
|
* app.use(PushlerPlugin, {
|
|
857
853
|
* appKey: 'your-app-key',
|
|
858
|
-
* wsUrl: 'wss://ws.pushler.ru/app',
|
|
859
854
|
* autoConnect: true
|
|
860
855
|
* });
|
|
861
856
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pushler-vue.umd.js","sources":["../src/usePushler.js","../src/usePushlerChannel.js","../src/plugin.js","../src/index.js"],"sourcesContent":["import { ref, reactive, readonly, onUnmounted, watch, computed } from 'vue';\n\n/**\n * Состояния подключения\n */\nexport const ConnectionStates = {\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n};\n\n/**\n * Типы каналов\n */\nexport const ChannelTypes = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PRESENCE: 'presence'\n};\n\n/**\n * Vue composable для работы с Pushler WebSocket\n * \n * @param {Object} options - Опции подключения\n * @param {string} options.appKey - Ключ приложения\n * @param {string} options.wsUrl - URL WebSocket сервера\n * @param {string} options.authEndpoint - Эндпоинт авторизации для приватных каналов\n * @param {boolean} options.autoConnect - Автоматическое подключение (по умолчанию false)\n * @param {number} options.reconnectDelay - Задержка переподключения в мс (по умолчанию 1000)\n * @param {number} options.maxReconnectAttempts - Максимум попыток переподключения (по умолчанию 5)\n * @returns {Object} Реактивный объект с методами и состоянием\n */\nexport function usePushler(options = {}) {\n // Реактивное состояние\n const connectionState = ref(ConnectionStates.DISCONNECTED);\n const socketId = ref(null);\n const error = ref(null);\n const reconnectAttempts = ref(0);\n \n // Каналы\n const channels = reactive(new Map());\n const channelAliases = reactive(new Map());\n \n // Внутренние переменные\n let socket = null;\n let reconnectTimer = null;\n const eventListeners = new Map();\n \n // Конфигурация\n const config = {\n appKey: options.appKey || '',\n wsUrl: options.wsUrl || 'wss://ws.pushler.ru/app',\n authEndpoint: options.authEndpoint || '/pushler/auth',\n autoConnect: options.autoConnect || false,\n reconnectDelay: options.reconnectDelay || 1000,\n maxReconnectAttempts: options.maxReconnectAttempts || 5,\n };\n \n // Вычисляемые свойства\n const isConnected = computed(() => connectionState.value === ConnectionStates.CONNECTED);\n const isConnecting = computed(() => connectionState.value === ConnectionStates.CONNECTING);\n const isReconnecting = computed(() => connectionState.value === ConnectionStates.RECONNECTING);\n \n /**\n * Форматирование имени канала с префиксом appKey\n */\n function formatChannelName(channelName) {\n if (channelName.startsWith(config.appKey + ':')) {\n return channelName;\n }\n return `${config.appKey}:${channelName}`;\n }\n \n /**\n * Извлечение оригинального имени канала\n */\n function extractChannelName(fullChannelName) {\n const prefix = config.appKey + ':';\n if (fullChannelName.startsWith(prefix)) {\n return fullChannelName.substring(prefix.length);\n }\n return fullChannelName;\n }\n \n /**\n * Определение типа канала\n */\n function getChannelType(channelName) {\n const baseName = extractChannelName(channelName);\n if (baseName.startsWith('private-')) return ChannelTypes.PRIVATE;\n if (baseName.startsWith('presence-')) return ChannelTypes.PRESENCE;\n return ChannelTypes.PUBLIC;\n }\n \n /**\n * Подключение к WebSocket серверу\n */\n function connect(connectOptions = {}) {\n // Обновляем конфигурацию если переданы новые параметры\n if (connectOptions.appKey) config.appKey = connectOptions.appKey;\n if (connectOptions.wsUrl) config.wsUrl = connectOptions.wsUrl;\n if (connectOptions.authEndpoint) config.authEndpoint = connectOptions.authEndpoint;\n \n if (connectionState.value === ConnectionStates.CONNECTED ||\n connectionState.value === ConnectionStates.CONNECTING) {\n return;\n }\n \n connectionState.value = ConnectionStates.CONNECTING;\n error.value = null;\n \n try {\n // Формируем URL с ключом приложения\n const wsUrl = config.wsUrl.endsWith('/') \n ? `${config.wsUrl}${config.appKey}`\n : `${config.wsUrl}/${config.appKey}`;\n \n console.log('[Pushler Vue] Connecting to:', wsUrl);\n socket = new WebSocket(wsUrl);\n setupSocketHandlers();\n } catch (err) {\n console.error('[Pushler Vue] Connection error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = err.message;\n }\n }\n \n /**\n * Настройка обработчиков WebSocket\n */\n function setupSocketHandlers() {\n socket.onopen = () => {\n console.log('[Pushler Vue] WebSocket opened, waiting for connection_established...');\n };\n \n socket.onmessage = (event) => {\n handleMessage(event);\n };\n \n socket.onclose = (event) => {\n console.log('[Pushler Vue] WebSocket closed:', event.code, event.reason);\n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n \n // Автопереподключение\n if (event.code !== 1000 && reconnectAttempts.value < config.maxReconnectAttempts) {\n scheduleReconnect();\n }\n };\n \n socket.onerror = (err) => {\n console.error('[Pushler Vue] WebSocket error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = 'Connection failed';\n };\n }\n \n /**\n * Обработка входящих сообщений\n */\n function handleMessage(event) {\n try {\n // Поддержка нескольких сообщений в одном event\n const messages = event.data.trim().split('\\n').filter(line => line.trim());\n \n for (const msgData of messages) {\n processMessage(JSON.parse(msgData));\n }\n } catch (err) {\n console.error('[Pushler Vue] Error parsing message:', err);\n }\n }\n \n /**\n * Обработка отдельного сообщения\n */\n function processMessage(message) {\n switch (message.event) {\n case 'pushler:connection_established':\n handleConnectionEstablished(message.data);\n break;\n case 'pushler:subscription_succeeded':\n handleSubscriptionSucceeded(message);\n break;\n case 'pushler:auth_success':\n handleAuthSuccess(message);\n break;\n case 'pushler:auth_error':\n handleAuthError(message);\n break;\n default:\n handleChannelMessage(message);\n }\n }\n \n /**\n * Обработка установления соединения\n */\n function handleConnectionEstablished(data) {\n socketId.value = data.socket_id;\n connectionState.value = ConnectionStates.CONNECTED;\n reconnectAttempts.value = 0;\n \n console.log('[Pushler Vue] Connected with socket ID:', socketId.value);\n \n // Переподписка на все каналы\n resubscribeAllChannels();\n \n emit('connected', { socketId: socketId.value });\n }\n \n /**\n * Переподписка на все каналы\n */\n function resubscribeAllChannels() {\n for (const [name, channel] of channels.entries()) {\n channel.subscribed = false;\n performChannelSubscription(channel);\n }\n }\n \n /**\n * Обработка успешной подписки\n */\n function handleSubscriptionSucceeded(message) {\n const channel = channels.get(message.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data || {});\n }\n }\n \n /**\n * Обработка успешной авторизации\n */\n function handleAuthSuccess(message) {\n const channel = channels.get(message.data.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data);\n }\n emit('auth_success', message.data);\n }\n \n /**\n * Обработка ошибки авторизации\n */\n function handleAuthError(message) {\n error.value = message.data.error;\n emit('auth_error', message.data);\n }\n \n /**\n * Обработка сообщения канала\n */\n function handleChannelMessage(message) {\n const { channel: channelName, event, data } = message;\n const channel = channels.get(channelName);\n \n if (channel) {\n channel.emit(event, data);\n }\n \n emit('message', { \n channel: extractChannelName(channelName), \n event, \n data \n });\n }\n \n /**\n * Планирование переподключения\n */\n function scheduleReconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n }\n \n reconnectAttempts.value++;\n connectionState.value = ConnectionStates.RECONNECTING;\n \n const delay = config.reconnectDelay * reconnectAttempts.value;\n console.log(`[Pushler Vue] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${config.maxReconnectAttempts})`);\n \n reconnectTimer = setTimeout(() => {\n connect();\n }, delay);\n }\n \n /**\n * Отключение от сервера\n */\n function disconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n \n if (socket) {\n socket.close(1000, 'User disconnect');\n socket = null;\n }\n \n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n channels.clear();\n channelAliases.clear();\n reconnectAttempts.value = 0;\n \n emit('disconnected');\n }\n \n /**\n * Отправка сообщения через WebSocket\n */\n function sendMessage(message) {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n \n /**\n * Подписка на канал\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции (signature для приватных, user для presence)\n * @returns {Object} Реактивный объект канала\n */\n function subscribe(channelName, subscribeOptions = {}) {\n const fullChannelName = formatChannelName(channelName);\n \n if (channels.has(fullChannelName)) {\n return channels.get(fullChannelName);\n }\n \n // Создаем реактивный канал\n const channel = reactive({\n name: fullChannelName,\n originalName: channelName,\n type: getChannelType(channelName),\n subscribed: false,\n options: subscribeOptions,\n listeners: new Map(),\n \n // Методы канала\n on(event, callback) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event).push(callback);\n return this;\n },\n \n off(event, callback) {\n if (this.listeners.has(event)) {\n const list = this.listeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n return this;\n },\n \n emit(event, data) {\n if (this.listeners.has(event)) {\n this.listeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Channel event error:', err);\n }\n });\n }\n },\n \n unsubscribe() {\n unsubscribe(channelName);\n }\n });\n \n channels.set(fullChannelName, channel);\n channelAliases.set(channelName, fullChannelName);\n \n // Подписываемся если уже подключены\n if (connectionState.value === ConnectionStates.CONNECTED) {\n performChannelSubscription(channel);\n }\n \n return channel;\n }\n \n /**\n * Выполнение подписки на канал\n */\n async function performChannelSubscription(channel) {\n if (connectionState.value !== ConnectionStates.CONNECTED) {\n return;\n }\n \n const channelType = channel.type;\n \n // Публичные каналы\n if (channelType === ChannelTypes.PUBLIC) {\n sendMessage({\n event: 'pushler:subscribe',\n data: {\n channel: channel.name,\n app_key: config.appKey\n }\n });\n return;\n }\n \n // Приватные и presence каналы требуют авторизации\n try {\n const authData = await getAuthData(channel);\n sendMessage({\n event: 'pushler:auth',\n data: authData\n });\n } catch (err) {\n console.error('[Pushler Vue] Auth error:', err);\n error.value = err.message;\n }\n }\n \n /**\n * Получение данных авторизации для приватных/presence каналов\n * \n * Для приватных каналов подпись ДОЛЖНА быть получена с вашего бэкенда,\n * либо передана в options.signature при подписке.\n * \n * НИКОГДА не храните секретный ключ в клиентском коде!\n */\n async function getAuthData(channel) {\n if (!socketId.value) {\n throw new Error('Socket ID not available');\n }\n \n const authData = {\n app_key: config.appKey,\n channel: channel.name,\n socket_id: socketId.value\n };\n \n // Если подпись уже предоставлена в options\n if (channel.options.signature) {\n authData.signature = channel.options.signature;\n } else {\n // Запрашиваем подпись с бэкенда\n authData.signature = await fetchSignature(channel);\n }\n \n // Данные пользователя для presence каналов\n if (channel.type === ChannelTypes.PRESENCE && channel.options.user) {\n authData.user = channel.options.user;\n }\n \n return authData;\n }\n \n /**\n * Запрос подписи с бэкенда\n * \n * Ваш бэкенд должен:\n * 1. Проверить авторизацию пользователя\n * 2. Сгенерировать HMAC-SHA256 подпись с секретным ключом\n * 3. Вернуть подпись клиенту\n */\n async function fetchSignature(channel) {\n const response = await fetch(config.authEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Включаем куки для авторизации\n body: JSON.stringify({\n channel_name: channel.name,\n socket_id: socketId.value,\n app_key: config.appKey,\n user_data: channel.options.user\n })\n });\n \n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Auth request failed' }));\n throw new Error(err.error || 'Failed to get signature');\n }\n \n const data = await response.json();\n return data.signature;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n const channel = channels.get(fullChannelName);\n \n if (channel) {\n if (channel.subscribed && connectionState.value === ConnectionStates.CONNECTED) {\n sendMessage({\n event: 'pushler:unsubscribe',\n data: { channel: fullChannelName }\n });\n }\n \n channels.delete(fullChannelName);\n channelAliases.delete(channelName);\n }\n }\n \n /**\n * Получение канала по имени\n */\n function channel(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n return channels.get(fullChannelName);\n }\n \n /**\n * Получение списка каналов\n */\n function getChannels() {\n return Array.from(channels.values()).map(ch => ({\n name: ch.originalName,\n fullName: ch.name,\n type: ch.type,\n subscribed: ch.subscribed\n }));\n }\n \n /**\n * Подписка на глобальное событие\n */\n function on(event, callback) {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, []);\n }\n eventListeners.get(event).push(callback);\n }\n \n /**\n * Отписка от глобального события\n */\n function off(event, callback) {\n if (eventListeners.has(event)) {\n const list = eventListeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n }\n \n /**\n * Вызов глобального события\n */\n function emit(event, data) {\n if (eventListeners.has(event)) {\n eventListeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Event error:', err);\n }\n });\n }\n }\n \n // Автоматическое отключение при размонтировании компонента\n onUnmounted(() => {\n disconnect();\n });\n \n // Автоподключение если указано\n if (config.autoConnect && config.appKey) {\n connect();\n }\n \n return {\n // Состояние (readonly для защиты от внешних изменений)\n connectionState: readonly(connectionState),\n socketId: readonly(socketId),\n error: readonly(error),\n reconnectAttempts: readonly(reconnectAttempts),\n \n // Вычисляемые свойства\n isConnected,\n isConnecting,\n isReconnecting,\n \n // Методы\n connect,\n disconnect,\n subscribe,\n unsubscribe,\n channel,\n getChannels,\n on,\n off,\n \n // Утилиты\n formatChannelName,\n extractChannelName,\n getChannelType,\n \n // Константы\n ConnectionStates,\n ChannelTypes,\n };\n}\n\nexport default usePushler;\n","import { ref, reactive, onUnmounted, watch } from 'vue';\n\n/**\n * Vue composable для работы с отдельным каналом Pushler\n * \n * Можно использовать автономно или совместно с usePushler\n * \n * @param {Object} pushler - Инстанс usePushler\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции канала\n * @returns {Object} Реактивный объект канала с событиями\n */\nexport function usePushlerChannel(pushler, channelName, options = {}) {\n const channel = ref(null);\n const isSubscribed = ref(false);\n const lastEvent = ref(null);\n const events = reactive([]);\n const eventHandlers = new Map();\n \n /**\n * Максимальное количество событий в буфере\n */\n const maxEvents = options.maxEvents || 100;\n \n /**\n * Подписка на канал\n */\n function subscribe() {\n if (!pushler || !channelName) return;\n \n channel.value = pushler.subscribe(channelName, options);\n \n // Отслеживаем статус подписки\n channel.value.on('subscribed', () => {\n isSubscribed.value = true;\n });\n \n return channel.value;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe() {\n if (pushler && channelName) {\n pushler.unsubscribe(channelName);\n channel.value = null;\n isSubscribed.value = false;\n }\n }\n \n /**\n * Подписка на событие канала\n * @param {string} eventName - Имя события\n * @param {Function} callback - Обработчик\n */\n function on(eventName, callback) {\n if (!channel.value) {\n subscribe();\n }\n \n const handler = (data) => {\n // Сохраняем последнее событие\n lastEvent.value = {\n event: eventName,\n data,\n timestamp: new Date()\n };\n \n // Добавляем в буфер событий\n events.unshift(lastEvent.value);\n if (events.length > maxEvents) {\n events.pop();\n }\n \n // Вызываем пользовательский обработчик\n callback(data);\n };\n \n eventHandlers.set(eventName, handler);\n channel.value.on(eventName, handler);\n \n return () => off(eventName);\n }\n \n /**\n * Отписка от события канала\n */\n function off(eventName) {\n if (channel.value && eventHandlers.has(eventName)) {\n channel.value.off(eventName, eventHandlers.get(eventName));\n eventHandlers.delete(eventName);\n }\n }\n \n /**\n * Очистка буфера событий\n */\n function clearEvents() {\n events.length = 0;\n lastEvent.value = null;\n }\n \n // Автоматическая подписка если указано\n if (options.autoSubscribe !== false && pushler?.isConnected?.value) {\n subscribe();\n }\n \n // Подписываемся при подключении\n if (pushler) {\n watch(() => pushler.isConnected.value, (connected) => {\n if (connected && options.autoSubscribe !== false && !channel.value) {\n subscribe();\n }\n });\n }\n \n // Автоматическая отписка при размонтировании\n onUnmounted(() => {\n unsubscribe();\n });\n \n return {\n channel,\n isSubscribed,\n lastEvent,\n events,\n \n subscribe,\n unsubscribe,\n on,\n off,\n clearEvents,\n };\n}\n\nexport default usePushlerChannel;\n","import { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\n\n/**\n * Символ для инъекции Pushler\n */\nexport const PushlerKey = Symbol('pushler');\n\n/**\n * Vue Plugin для глобальной инициализации Pushler\n * \n * Использование:\n * \n * ```js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app',\n * autoConnect: true\n * });\n * ```\n * \n * Затем в компонентах:\n * \n * ```js\n * import { inject } from 'vue';\n * import { PushlerKey } from '@pushler/vue';\n * \n * const pushler = inject(PushlerKey);\n * ```\n */\nexport const PushlerPlugin = {\n install(app, options = {}) {\n // Создаем глобальный инстанс Pushler\n const pushler = usePushler(options);\n \n // Предоставляем через provide/inject\n app.provide(PushlerKey, pushler);\n \n // Также добавляем как глобальное свойство (для Options API)\n app.config.globalProperties.$pushler = pushler;\n \n // Экспортируем константы\n app.config.globalProperties.$PushlerConnectionStates = ConnectionStates;\n app.config.globalProperties.$PushlerChannelTypes = ChannelTypes;\n }\n};\n\n/**\n * Хелпер для получения инстанса Pushler в setup()\n */\nexport function usePushlerInstance() {\n const pushler = inject(PushlerKey);\n if (!pushler) {\n throw new Error(\n '[Pushler Vue] No Pushler instance found. ' +\n 'Make sure to install PushlerPlugin or provide a Pushler instance.'\n );\n }\n return pushler;\n}\n\nexport default PushlerPlugin;\n","/**\n * Pushler Vue SDK\n * \n * Реактивный Vue.js SDK для работы с Pushler.ru WebSocket сервером\n * \n * @example Базовое использование\n * ```vue\n * <script setup>\n * import { usePushler } from '@pushler/vue';\n * \n * const pushler = usePushler({\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app'\n * });\n * \n * // Подключение\n * pushler.connect();\n * \n * // Подписка на канал\n * const channel = pushler.subscribe('my-channel');\n * channel.on('message', (data) => {\n * console.log('Received:', data);\n * });\n * </script>\n * \n * <template>\n * <div>\n * <p>Status: {{ pushler.connectionState }}</p>\n * <p>Socket ID: {{ pushler.socketId }}</p>\n * </div>\n * </template>\n * ```\n * \n * @example С Vue Plugin\n * ```js\n * // main.js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app',\n * autoConnect: true\n * });\n * ```\n */\n\n// Основные composables\nexport { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\nexport { usePushlerChannel } from './usePushlerChannel';\n\n// Plugin\nexport { PushlerPlugin, PushlerKey, usePushlerInstance } from './plugin';\n\n// Default export\nimport { usePushler } from './usePushler';\nexport default usePushler;\n"],"names":["ref","reactive","computed","onUnmounted","readonly","watch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pushler-vue.umd.js","sources":["../src/usePushler.js","../src/usePushlerChannel.js","../src/plugin.js","../src/index.js"],"sourcesContent":["import { ref, reactive, readonly, onUnmounted, watch, computed } from 'vue';\n\n/**\n * Состояния подключения\n */\nexport const ConnectionStates = {\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n};\n\n/**\n * Типы каналов\n */\nexport const ChannelTypes = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PRESENCE: 'presence'\n};\n\n/**\n * Vue composable для работы с Pushler WebSocket\n * \n * @param {Object} options - Опции подключения\n * @param {string} options.appKey - Ключ приложения\n * @param {string} options.wsUrl - URL WebSocket сервера\n * @param {string} options.authEndpoint - Эндпоинт авторизации для приватных каналов\n * @param {boolean} options.autoConnect - Автоматическое подключение (по умолчанию false)\n * @param {number} options.reconnectDelay - Задержка переподключения в мс (по умолчанию 1000)\n * @param {number} options.maxReconnectAttempts - Максимум попыток переподключения (по умолчанию 5)\n * @returns {Object} Реактивный объект с методами и состоянием\n */\nexport function usePushler(options = {}) {\n // Реактивное состояние\n const connectionState = ref(ConnectionStates.DISCONNECTED);\n const socketId = ref(null);\n const error = ref(null);\n const reconnectAttempts = ref(0);\n \n // Каналы\n const channels = reactive(new Map());\n const channelAliases = reactive(new Map());\n \n // Внутренние переменные\n let socket = null;\n let reconnectTimer = null;\n const eventListeners = new Map();\n \n // Конфигурация\n const appKey = options.appKey || '';\n const config = {\n appKey: appKey,\n // wsUrl формируется автоматически из appKey, но можно переопределить\n wsUrl: options.wsUrl || `wss://ws.pushler.ru/app/${appKey}`,\n authEndpoint: options.authEndpoint || '/pushler/auth',\n autoConnect: options.autoConnect || false,\n reconnectDelay: options.reconnectDelay || 1000,\n maxReconnectAttempts: options.maxReconnectAttempts || 5,\n };\n \n // Вычисляемые свойства\n const isConnected = computed(() => connectionState.value === ConnectionStates.CONNECTED);\n const isConnecting = computed(() => connectionState.value === ConnectionStates.CONNECTING);\n const isReconnecting = computed(() => connectionState.value === ConnectionStates.RECONNECTING);\n \n /**\n * Форматирование имени канала с префиксом appKey\n */\n function formatChannelName(channelName) {\n if (channelName.startsWith(config.appKey + ':')) {\n return channelName;\n }\n return `${config.appKey}:${channelName}`;\n }\n \n /**\n * Извлечение оригинального имени канала\n */\n function extractChannelName(fullChannelName) {\n const prefix = config.appKey + ':';\n if (fullChannelName.startsWith(prefix)) {\n return fullChannelName.substring(prefix.length);\n }\n return fullChannelName;\n }\n \n /**\n * Определение типа канала\n */\n function getChannelType(channelName) {\n const baseName = extractChannelName(channelName);\n if (baseName.startsWith('private-')) return ChannelTypes.PRIVATE;\n if (baseName.startsWith('presence-')) return ChannelTypes.PRESENCE;\n return ChannelTypes.PUBLIC;\n }\n \n /**\n * Подключение к WebSocket серверу\n */\n function connect(connectOptions = {}) {\n // Обновляем конфигурацию если переданы новые параметры\n if (connectOptions.appKey) config.appKey = connectOptions.appKey;\n if (connectOptions.wsUrl) config.wsUrl = connectOptions.wsUrl;\n if (connectOptions.authEndpoint) config.authEndpoint = connectOptions.authEndpoint;\n \n if (connectionState.value === ConnectionStates.CONNECTED ||\n connectionState.value === ConnectionStates.CONNECTING) {\n return;\n }\n \n connectionState.value = ConnectionStates.CONNECTING;\n error.value = null;\n \n try {\n // wsUrl уже содержит appKey из конфигурации\n console.log('[Pushler Vue] Connecting to:', config.wsUrl);\n socket = new WebSocket(config.wsUrl);\n setupSocketHandlers();\n } catch (err) {\n console.error('[Pushler Vue] Connection error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = err.message;\n }\n }\n \n /**\n * Настройка обработчиков WebSocket\n */\n function setupSocketHandlers() {\n socket.onopen = () => {\n console.log('[Pushler Vue] WebSocket opened, waiting for connection_established...');\n };\n \n socket.onmessage = (event) => {\n handleMessage(event);\n };\n \n socket.onclose = (event) => {\n console.log('[Pushler Vue] WebSocket closed:', event.code, event.reason);\n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n \n // Автопереподключение\n if (event.code !== 1000 && reconnectAttempts.value < config.maxReconnectAttempts) {\n scheduleReconnect();\n }\n };\n \n socket.onerror = (err) => {\n console.error('[Pushler Vue] WebSocket error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = 'Connection failed';\n };\n }\n \n /**\n * Обработка входящих сообщений\n */\n function handleMessage(event) {\n try {\n // Поддержка нескольких сообщений в одном event\n const messages = event.data.trim().split('\\n').filter(line => line.trim());\n \n for (const msgData of messages) {\n processMessage(JSON.parse(msgData));\n }\n } catch (err) {\n console.error('[Pushler Vue] Error parsing message:', err);\n }\n }\n \n /**\n * Обработка отдельного сообщения\n */\n function processMessage(message) {\n switch (message.event) {\n case 'pushler:connection_established':\n handleConnectionEstablished(message.data);\n break;\n case 'pushler:subscription_succeeded':\n handleSubscriptionSucceeded(message);\n break;\n case 'pushler:auth_success':\n handleAuthSuccess(message);\n break;\n case 'pushler:auth_error':\n handleAuthError(message);\n break;\n default:\n handleChannelMessage(message);\n }\n }\n \n /**\n * Обработка установления соединения\n */\n function handleConnectionEstablished(data) {\n socketId.value = data.socket_id;\n connectionState.value = ConnectionStates.CONNECTED;\n reconnectAttempts.value = 0;\n \n console.log('[Pushler Vue] Connected with socket ID:', socketId.value);\n \n // Переподписка на все каналы\n resubscribeAllChannels();\n \n emit('connected', { socketId: socketId.value });\n }\n \n /**\n * Переподписка на все каналы\n */\n function resubscribeAllChannels() {\n for (const [name, channel] of channels.entries()) {\n channel.subscribed = false;\n performChannelSubscription(channel);\n }\n }\n \n /**\n * Обработка успешной подписки\n */\n function handleSubscriptionSucceeded(message) {\n const channel = channels.get(message.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data || {});\n }\n }\n \n /**\n * Обработка успешной авторизации\n */\n function handleAuthSuccess(message) {\n const channel = channels.get(message.data.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data);\n }\n emit('auth_success', message.data);\n }\n \n /**\n * Обработка ошибки авторизации\n */\n function handleAuthError(message) {\n error.value = message.data.error;\n emit('auth_error', message.data);\n }\n \n /**\n * Обработка сообщения канала\n */\n function handleChannelMessage(message) {\n const { channel: channelName, event, data } = message;\n const channel = channels.get(channelName);\n \n if (channel) {\n channel.emit(event, data);\n }\n \n emit('message', { \n channel: extractChannelName(channelName), \n event, \n data \n });\n }\n \n /**\n * Планирование переподключения\n */\n function scheduleReconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n }\n \n reconnectAttempts.value++;\n connectionState.value = ConnectionStates.RECONNECTING;\n \n const delay = config.reconnectDelay * reconnectAttempts.value;\n console.log(`[Pushler Vue] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${config.maxReconnectAttempts})`);\n \n reconnectTimer = setTimeout(() => {\n connect();\n }, delay);\n }\n \n /**\n * Отключение от сервера\n */\n function disconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n \n if (socket) {\n socket.close(1000, 'User disconnect');\n socket = null;\n }\n \n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n channels.clear();\n channelAliases.clear();\n reconnectAttempts.value = 0;\n \n emit('disconnected');\n }\n \n /**\n * Отправка сообщения через WebSocket\n */\n function sendMessage(message) {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n \n /**\n * Подписка на канал\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции (signature для приватных, user для presence)\n * @returns {Object} Реактивный объект канала\n */\n function subscribe(channelName, subscribeOptions = {}) {\n const fullChannelName = formatChannelName(channelName);\n \n if (channels.has(fullChannelName)) {\n return channels.get(fullChannelName);\n }\n \n // Создаем реактивный канал\n const channel = reactive({\n name: fullChannelName,\n originalName: channelName,\n type: getChannelType(channelName),\n subscribed: false,\n options: subscribeOptions,\n listeners: new Map(),\n \n // Методы канала\n on(event, callback) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event).push(callback);\n return this;\n },\n \n off(event, callback) {\n if (this.listeners.has(event)) {\n const list = this.listeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n return this;\n },\n \n emit(event, data) {\n if (this.listeners.has(event)) {\n this.listeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Channel event error:', err);\n }\n });\n }\n },\n \n unsubscribe() {\n unsubscribe(channelName);\n }\n });\n \n channels.set(fullChannelName, channel);\n channelAliases.set(channelName, fullChannelName);\n \n // Подписываемся если уже подключены\n if (connectionState.value === ConnectionStates.CONNECTED) {\n performChannelSubscription(channel);\n }\n \n return channel;\n }\n \n /**\n * Выполнение подписки на канал\n */\n async function performChannelSubscription(channel) {\n if (connectionState.value !== ConnectionStates.CONNECTED) {\n return;\n }\n \n const channelType = channel.type;\n \n // Публичные каналы\n if (channelType === ChannelTypes.PUBLIC) {\n sendMessage({\n event: 'pushler:subscribe',\n data: {\n channel: channel.name,\n app_key: config.appKey\n }\n });\n return;\n }\n \n // Приватные и presence каналы требуют авторизации\n try {\n const authData = await getAuthData(channel);\n sendMessage({\n event: 'pushler:auth',\n data: authData\n });\n } catch (err) {\n console.error('[Pushler Vue] Auth error:', err);\n error.value = err.message;\n }\n }\n \n /**\n * Получение данных авторизации для приватных/presence каналов\n * \n * Для приватных каналов подпись ДОЛЖНА быть получена с вашего бэкенда,\n * либо передана в options.signature при подписке.\n * \n * НИКОГДА не храните секретный ключ в клиентском коде!\n */\n async function getAuthData(channel) {\n if (!socketId.value) {\n throw new Error('Socket ID not available');\n }\n \n const authData = {\n app_key: config.appKey,\n channel: channel.name,\n socket_id: socketId.value\n };\n \n // Если подпись уже предоставлена в options\n if (channel.options.signature) {\n authData.signature = channel.options.signature;\n } else {\n // Запрашиваем подпись с бэкенда\n authData.signature = await fetchSignature(channel);\n }\n \n // Данные пользователя для presence каналов\n if (channel.type === ChannelTypes.PRESENCE && channel.options.user) {\n authData.user = channel.options.user;\n }\n \n return authData;\n }\n \n /**\n * Запрос подписи с бэкенда\n * \n * Ваш бэкенд должен:\n * 1. Проверить авторизацию пользователя\n * 2. Сгенерировать HMAC-SHA256 подпись с секретным ключом\n * 3. Вернуть подпись клиенту\n */\n async function fetchSignature(channel) {\n const response = await fetch(config.authEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Включаем куки для авторизации\n body: JSON.stringify({\n channel_name: channel.name,\n socket_id: socketId.value,\n app_key: config.appKey,\n user_data: channel.options.user\n })\n });\n \n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Auth request failed' }));\n throw new Error(err.error || 'Failed to get signature');\n }\n \n const data = await response.json();\n return data.signature;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n const channel = channels.get(fullChannelName);\n \n if (channel) {\n if (channel.subscribed && connectionState.value === ConnectionStates.CONNECTED) {\n sendMessage({\n event: 'pushler:unsubscribe',\n data: { channel: fullChannelName }\n });\n }\n \n channels.delete(fullChannelName);\n channelAliases.delete(channelName);\n }\n }\n \n /**\n * Получение канала по имени\n */\n function channel(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n return channels.get(fullChannelName);\n }\n \n /**\n * Получение списка каналов\n */\n function getChannels() {\n return Array.from(channels.values()).map(ch => ({\n name: ch.originalName,\n fullName: ch.name,\n type: ch.type,\n subscribed: ch.subscribed\n }));\n }\n \n /**\n * Подписка на глобальное событие\n */\n function on(event, callback) {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, []);\n }\n eventListeners.get(event).push(callback);\n }\n \n /**\n * Отписка от глобального события\n */\n function off(event, callback) {\n if (eventListeners.has(event)) {\n const list = eventListeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n }\n \n /**\n * Вызов глобального события\n */\n function emit(event, data) {\n if (eventListeners.has(event)) {\n eventListeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Event error:', err);\n }\n });\n }\n }\n \n // Автоматическое отключение при размонтировании компонента\n onUnmounted(() => {\n disconnect();\n });\n \n // Автоподключение если указано\n if (config.autoConnect && config.appKey) {\n connect();\n }\n \n return {\n // Состояние (readonly для защиты от внешних изменений)\n connectionState: readonly(connectionState),\n socketId: readonly(socketId),\n error: readonly(error),\n reconnectAttempts: readonly(reconnectAttempts),\n \n // Вычисляемые свойства\n isConnected,\n isConnecting,\n isReconnecting,\n \n // Методы\n connect,\n disconnect,\n subscribe,\n unsubscribe,\n channel,\n getChannels,\n on,\n off,\n \n // Утилиты\n formatChannelName,\n extractChannelName,\n getChannelType,\n \n // Константы\n ConnectionStates,\n ChannelTypes,\n };\n}\n\nexport default usePushler;\n","import { ref, reactive, onUnmounted, watch } from 'vue';\n\n/**\n * Vue composable для работы с отдельным каналом Pushler\n * \n * Можно использовать автономно или совместно с usePushler\n * \n * @param {Object} pushler - Инстанс usePushler\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции канала\n * @returns {Object} Реактивный объект канала с событиями\n */\nexport function usePushlerChannel(pushler, channelName, options = {}) {\n const channel = ref(null);\n const isSubscribed = ref(false);\n const lastEvent = ref(null);\n const events = reactive([]);\n const eventHandlers = new Map();\n \n /**\n * Максимальное количество событий в буфере\n */\n const maxEvents = options.maxEvents || 100;\n \n /**\n * Подписка на канал\n */\n function subscribe() {\n if (!pushler || !channelName) return;\n \n channel.value = pushler.subscribe(channelName, options);\n \n // Отслеживаем статус подписки\n channel.value.on('subscribed', () => {\n isSubscribed.value = true;\n });\n \n return channel.value;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe() {\n if (pushler && channelName) {\n pushler.unsubscribe(channelName);\n channel.value = null;\n isSubscribed.value = false;\n }\n }\n \n /**\n * Подписка на событие канала\n * @param {string} eventName - Имя события\n * @param {Function} callback - Обработчик\n */\n function on(eventName, callback) {\n if (!channel.value) {\n subscribe();\n }\n \n const handler = (data) => {\n // Сохраняем последнее событие\n lastEvent.value = {\n event: eventName,\n data,\n timestamp: new Date()\n };\n \n // Добавляем в буфер событий\n events.unshift(lastEvent.value);\n if (events.length > maxEvents) {\n events.pop();\n }\n \n // Вызываем пользовательский обработчик\n callback(data);\n };\n \n eventHandlers.set(eventName, handler);\n channel.value.on(eventName, handler);\n \n return () => off(eventName);\n }\n \n /**\n * Отписка от события канала\n */\n function off(eventName) {\n if (channel.value && eventHandlers.has(eventName)) {\n channel.value.off(eventName, eventHandlers.get(eventName));\n eventHandlers.delete(eventName);\n }\n }\n \n /**\n * Очистка буфера событий\n */\n function clearEvents() {\n events.length = 0;\n lastEvent.value = null;\n }\n \n // Автоматическая подписка если указано\n if (options.autoSubscribe !== false && pushler?.isConnected?.value) {\n subscribe();\n }\n \n // Подписываемся при подключении\n if (pushler) {\n watch(() => pushler.isConnected.value, (connected) => {\n if (connected && options.autoSubscribe !== false && !channel.value) {\n subscribe();\n }\n });\n }\n \n // Автоматическая отписка при размонтировании\n onUnmounted(() => {\n unsubscribe();\n });\n \n return {\n channel,\n isSubscribed,\n lastEvent,\n events,\n \n subscribe,\n unsubscribe,\n on,\n off,\n clearEvents,\n };\n}\n\nexport default usePushlerChannel;\n","import { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\n\n/**\n * Символ для инъекции Pushler\n */\nexport const PushlerKey = Symbol('pushler');\n\n/**\n * Vue Plugin для глобальной инициализации Pushler\n * \n * Использование:\n * \n * ```js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * autoConnect: true\n * });\n * ```\n * \n * Затем в компонентах:\n * \n * ```js\n * import { inject } from 'vue';\n * import { PushlerKey } from '@pushler/vue';\n * \n * const pushler = inject(PushlerKey);\n * ```\n */\nexport const PushlerPlugin = {\n install(app, options = {}) {\n // Создаем глобальный инстанс Pushler\n const pushler = usePushler(options);\n \n // Предоставляем через provide/inject\n app.provide(PushlerKey, pushler);\n \n // Также добавляем как глобальное свойство (для Options API)\n app.config.globalProperties.$pushler = pushler;\n \n // Экспортируем константы\n app.config.globalProperties.$PushlerConnectionStates = ConnectionStates;\n app.config.globalProperties.$PushlerChannelTypes = ChannelTypes;\n }\n};\n\n/**\n * Хелпер для получения инстанса Pushler в setup()\n */\nexport function usePushlerInstance() {\n const pushler = inject(PushlerKey);\n if (!pushler) {\n throw new Error(\n '[Pushler Vue] No Pushler instance found. ' +\n 'Make sure to install PushlerPlugin or provide a Pushler instance.'\n );\n }\n return pushler;\n}\n\nexport default PushlerPlugin;\n","/**\n * Pushler Vue SDK\n * \n * Реактивный Vue.js SDK для работы с Pushler.ru WebSocket сервером\n * \n * @example Базовое использование\n * ```vue\n * <script setup>\n * import { usePushler } from '@pushler/vue';\n * \n * const pushler = usePushler({\n * appKey: 'your-app-key'\n * });\n * \n * // Подключение\n * pushler.connect();\n * \n * // Подписка на канал\n * const channel = pushler.subscribe('my-channel');\n * channel.on('message', (data) => {\n * console.log('Received:', data);\n * });\n * </script>\n * \n * <template>\n * <div>\n * <p>Status: {{ pushler.connectionState }}</p>\n * <p>Socket ID: {{ pushler.socketId }}</p>\n * </div>\n * </template>\n * ```\n * \n * @example С Vue Plugin\n * ```js\n * // main.js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * autoConnect: true\n * });\n * ```\n */\n\n// Основные composables\nexport { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\nexport { usePushlerChannel } from './usePushlerChannel';\n\n// Plugin\nexport { PushlerPlugin, PushlerKey, usePushlerInstance } from './plugin';\n\n// Default export\nimport { usePushler } from './usePushler';\nexport default usePushler;\n"],"names":["ref","reactive","computed","onUnmounted","readonly","watch"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @pushler/vue v1.0.
|
|
2
|
+
* @pushler/vue v1.0.3
|
|
3
3
|
* (c) 2026 Pushler.ru
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
6
|
-
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).PushlerVue={},e.Vue)}(this,function(e,n){"use strict";const t={CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTED:"disconnected",RECONNECTING:"reconnecting",FAILED:"failed"},s={PUBLIC:"public",PRIVATE:"private",PRESENCE:"presence"};function o(e={}){const o=n.ref(t.DISCONNECTED),a=n.ref(null),r=n.ref(null),u=n.ref(0),c=n.reactive(new Map),l=n.reactive(new Map);let i=null,h=null;const p=new Map,d=
|
|
6
|
+
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).PushlerVue={},e.Vue)}(this,function(e,n){"use strict";const t={CONNECTING:"connecting",CONNECTED:"connected",DISCONNECTED:"disconnected",RECONNECTING:"reconnecting",FAILED:"failed"},s={PUBLIC:"public",PRIVATE:"private",PRESENCE:"presence"};function o(e={}){const o=n.ref(t.DISCONNECTED),a=n.ref(null),r=n.ref(null),u=n.ref(0),c=n.reactive(new Map),l=n.reactive(new Map);let i=null,h=null;const p=new Map,d=e.appKey||"",f={appKey:d,wsUrl:e.wsUrl||`wss://ws.pushler.ru/app/${d}`,authEndpoint:e.authEndpoint||"/pushler/auth",autoConnect:e.autoConnect||!1,reconnectDelay:e.reconnectDelay||1e3,maxReconnectAttempts:e.maxReconnectAttempts||5},v=n.computed(()=>o.value===t.CONNECTED),b=n.computed(()=>o.value===t.CONNECTING),C=n.computed(()=>o.value===t.RECONNECTING);function E(e){return e.startsWith(f.appKey+":")?e:`${f.appKey}:${e}`}function g(e){const n=f.appKey+":";return e.startsWith(n)?e.substring(n.length):e}function N(e){const n=g(e);return n.startsWith("private-")?s.PRIVATE:n.startsWith("presence-")?s.PRESENCE:s.PUBLIC}function m(e={}){if(e.appKey&&(f.appKey=e.appKey),e.wsUrl&&(f.wsUrl=e.wsUrl),e.authEndpoint&&(f.authEndpoint=e.authEndpoint),o.value!==t.CONNECTED&&o.value!==t.CONNECTING){o.value=t.CONNECTING,r.value=null;try{console.log("[Pushler Vue] Connecting to:",f.wsUrl),i=new WebSocket(f.wsUrl),i.onopen=()=>{console.log("[Pushler Vue] WebSocket opened, waiting for connection_established...")},i.onmessage=e=>{!function(e){try{const n=e.data.trim().split("\n").filter(e=>e.trim());for(const e of n)y(JSON.parse(e))}catch(e){console.error("[Pushler Vue] Error parsing message:",e)}}(e)},i.onclose=e=>{console.log("[Pushler Vue] WebSocket closed:",e.code,e.reason),o.value=t.DISCONNECTED,a.value=null,1e3!==e.code&&u.value<f.maxReconnectAttempts&&function(){h&&clearTimeout(h),u.value++,o.value=t.RECONNECTING;const e=f.reconnectDelay*u.value;console.log(`[Pushler Vue] Reconnecting in ${e}ms (attempt ${u.value}/${f.maxReconnectAttempts})`),h=setTimeout(()=>{m()},e)}()},i.onerror=e=>{console.error("[Pushler Vue] WebSocket error:",e),o.value=t.FAILED,r.value="Connection failed"}}catch(e){console.error("[Pushler Vue] Connection error:",e),o.value=t.FAILED,r.value=e.message}}}function y(e){switch(e.event){case"pushler:connection_established":n=e.data,a.value=n.socket_id,o.value=t.CONNECTED,u.value=0,console.log("[Pushler Vue] Connected with socket ID:",a.value),function(){for(const[e,n]of c.entries())n.subscribed=!1,T(n)}(),S("connected",{socketId:a.value});break;case"pushler:subscription_succeeded":!function(e){const n=c.get(e.channel);n&&(n.subscribed=!0,n.emit("subscribed",e.data||{}))}(e);break;case"pushler:auth_success":!function(e){const n=c.get(e.data.channel);n&&(n.subscribed=!0,n.emit("subscribed",e.data));S("auth_success",e.data)}(e);break;case"pushler:auth_error":!function(e){r.value=e.data.error,S("auth_error",e.data)}(e);break;default:!function(e){const{channel:n,event:t,data:s}=e,o=c.get(n);o&&o.emit(t,s);S("message",{channel:g(n),event:t,data:s})}(e)}var n}function P(){h&&(clearTimeout(h),h=null),i&&(i.close(1e3,"User disconnect"),i=null),o.value=t.DISCONNECTED,a.value=null,c.clear(),l.clear(),u.value=0,S("disconnected")}function w(e){i&&i.readyState===WebSocket.OPEN&&i.send(JSON.stringify(e))}async function T(e){if(o.value!==t.CONNECTED)return;if(e.type!==s.PUBLIC)try{const n=await async function(e){if(!a.value)throw new Error("Socket ID not available");const n={app_key:f.appKey,channel:e.name,socket_id:a.value};e.options.signature?n.signature=e.options.signature:n.signature=await async function(e){const n=await fetch(f.authEndpoint,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({channel_name:e.name,socket_id:a.value,app_key:f.appKey,user_data:e.options.user})});if(!n.ok){const e=await n.json().catch(()=>({error:"Auth request failed"}));throw new Error(e.error||"Failed to get signature")}return(await n.json()).signature}(e);e.type===s.PRESENCE&&e.options.user&&(n.user=e.options.user);return n}(e);w({event:"pushler:auth",data:n})}catch(e){console.error("[Pushler Vue] Auth error:",e),r.value=e.message}else w({event:"pushler:subscribe",data:{channel:e.name,app_key:f.appKey}})}function O(e){const n=l.get(e)||E(e),s=c.get(n);s&&(s.subscribed&&o.value===t.CONNECTED&&w({event:"pushler:unsubscribe",data:{channel:n}}),c.delete(n),l.delete(e))}function S(e,n){p.has(e)&&p.get(e).forEach(e=>{try{e(n)}catch(e){console.error("[Pushler Vue] Event error:",e)}})}return n.onUnmounted(()=>{P()}),f.autoConnect&&f.appKey&&m(),{connectionState:n.readonly(o),socketId:n.readonly(a),error:n.readonly(r),reconnectAttempts:n.readonly(u),isConnected:v,isConnecting:b,isReconnecting:C,connect:m,disconnect:P,subscribe:function(e,s={}){const a=E(e);if(c.has(a))return c.get(a);const r=n.reactive({name:a,originalName:e,type:N(e),subscribed:!1,options:s,listeners:new Map,on(e,n){return this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(n),this},off(e,n){if(this.listeners.has(e)){const t=this.listeners.get(e),s=t.indexOf(n);s>-1&&t.splice(s,1)}return this},emit(e,n){this.listeners.has(e)&&this.listeners.get(e).forEach(e=>{try{e(n)}catch(e){console.error("[Pushler Vue] Channel event error:",e)}})},unsubscribe(){O(e)}});return c.set(a,r),l.set(e,a),o.value===t.CONNECTED&&T(r),r},unsubscribe:O,channel:function(e){const n=l.get(e)||E(e);return c.get(n)},getChannels:function(){return Array.from(c.values()).map(e=>({name:e.originalName,fullName:e.name,type:e.type,subscribed:e.subscribed}))},on:function(e,n){p.has(e)||p.set(e,[]),p.get(e).push(n)},off:function(e,n){if(p.has(e)){const t=p.get(e),s=t.indexOf(n);s>-1&&t.splice(s,1)}},formatChannelName:E,extractChannelName:g,getChannelType:N,ConnectionStates:t,ChannelTypes:s}}const a=Symbol("pushler"),r={install(e,n={}){const r=o(n);e.provide(a,r),e.config.globalProperties.$pushler=r,e.config.globalProperties.$PushlerConnectionStates=t,e.config.globalProperties.$PushlerChannelTypes=s}};e.ChannelTypes=s,e.ConnectionStates=t,e.PushlerKey=a,e.PushlerPlugin=r,e.default=o,e.usePushler=o,e.usePushlerChannel=function(e,t,s={}){const o=n.ref(null),a=n.ref(!1),r=n.ref(null),u=n.reactive([]),c=new Map,l=s.maxEvents||100;function i(){if(e&&t)return o.value=e.subscribe(t,s),o.value.on("subscribed",()=>{a.value=!0}),o.value}function h(){e&&t&&(e.unsubscribe(t),o.value=null,a.value=!1)}function p(e){o.value&&c.has(e)&&(o.value.off(e,c.get(e)),c.delete(e))}return!1!==s.autoSubscribe&&e?.isConnected?.value&&i(),e&&n.watch(()=>e.isConnected.value,e=>{e&&!1!==s.autoSubscribe&&!o.value&&i()}),n.onUnmounted(()=>{h()}),{channel:o,isSubscribed:a,lastEvent:r,events:u,subscribe:i,unsubscribe:h,on:function(e,n){o.value||i();const t=t=>{r.value={event:e,data:t,timestamp:new Date},u.unshift(r.value),u.length>l&&u.pop(),n(t)};return c.set(e,t),o.value.on(e,t),()=>p(e)},off:p,clearEvents:function(){u.length=0,r.value=null}}},e.usePushlerInstance=function(){const e=inject(a);if(!e)throw new Error("[Pushler Vue] No Pushler instance found. Make sure to install PushlerPlugin or provide a Pushler instance.");return e},Object.defineProperty(e,"__esModule",{value:!0})});
|
|
7
7
|
//# sourceMappingURL=pushler-vue.umd.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pushler-vue.umd.min.js","sources":["../src/usePushler.js","../src/plugin.js","../src/usePushlerChannel.js"],"sourcesContent":["import { ref, reactive, readonly, onUnmounted, watch, computed } from 'vue';\n\n/**\n * Состояния подключения\n */\nexport const ConnectionStates = {\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n};\n\n/**\n * Типы каналов\n */\nexport const ChannelTypes = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PRESENCE: 'presence'\n};\n\n/**\n * Vue composable для работы с Pushler WebSocket\n * \n * @param {Object} options - Опции подключения\n * @param {string} options.appKey - Ключ приложения\n * @param {string} options.wsUrl - URL WebSocket сервера\n * @param {string} options.authEndpoint - Эндпоинт авторизации для приватных каналов\n * @param {boolean} options.autoConnect - Автоматическое подключение (по умолчанию false)\n * @param {number} options.reconnectDelay - Задержка переподключения в мс (по умолчанию 1000)\n * @param {number} options.maxReconnectAttempts - Максимум попыток переподключения (по умолчанию 5)\n * @returns {Object} Реактивный объект с методами и состоянием\n */\nexport function usePushler(options = {}) {\n // Реактивное состояние\n const connectionState = ref(ConnectionStates.DISCONNECTED);\n const socketId = ref(null);\n const error = ref(null);\n const reconnectAttempts = ref(0);\n \n // Каналы\n const channels = reactive(new Map());\n const channelAliases = reactive(new Map());\n \n // Внутренние переменные\n let socket = null;\n let reconnectTimer = null;\n const eventListeners = new Map();\n \n // Конфигурация\n const config = {\n appKey: options.appKey || '',\n wsUrl: options.wsUrl || 'wss://ws.pushler.ru/app',\n authEndpoint: options.authEndpoint || '/pushler/auth',\n autoConnect: options.autoConnect || false,\n reconnectDelay: options.reconnectDelay || 1000,\n maxReconnectAttempts: options.maxReconnectAttempts || 5,\n };\n \n // Вычисляемые свойства\n const isConnected = computed(() => connectionState.value === ConnectionStates.CONNECTED);\n const isConnecting = computed(() => connectionState.value === ConnectionStates.CONNECTING);\n const isReconnecting = computed(() => connectionState.value === ConnectionStates.RECONNECTING);\n \n /**\n * Форматирование имени канала с префиксом appKey\n */\n function formatChannelName(channelName) {\n if (channelName.startsWith(config.appKey + ':')) {\n return channelName;\n }\n return `${config.appKey}:${channelName}`;\n }\n \n /**\n * Извлечение оригинального имени канала\n */\n function extractChannelName(fullChannelName) {\n const prefix = config.appKey + ':';\n if (fullChannelName.startsWith(prefix)) {\n return fullChannelName.substring(prefix.length);\n }\n return fullChannelName;\n }\n \n /**\n * Определение типа канала\n */\n function getChannelType(channelName) {\n const baseName = extractChannelName(channelName);\n if (baseName.startsWith('private-')) return ChannelTypes.PRIVATE;\n if (baseName.startsWith('presence-')) return ChannelTypes.PRESENCE;\n return ChannelTypes.PUBLIC;\n }\n \n /**\n * Подключение к WebSocket серверу\n */\n function connect(connectOptions = {}) {\n // Обновляем конфигурацию если переданы новые параметры\n if (connectOptions.appKey) config.appKey = connectOptions.appKey;\n if (connectOptions.wsUrl) config.wsUrl = connectOptions.wsUrl;\n if (connectOptions.authEndpoint) config.authEndpoint = connectOptions.authEndpoint;\n \n if (connectionState.value === ConnectionStates.CONNECTED ||\n connectionState.value === ConnectionStates.CONNECTING) {\n return;\n }\n \n connectionState.value = ConnectionStates.CONNECTING;\n error.value = null;\n \n try {\n // Формируем URL с ключом приложения\n const wsUrl = config.wsUrl.endsWith('/') \n ? `${config.wsUrl}${config.appKey}`\n : `${config.wsUrl}/${config.appKey}`;\n \n console.log('[Pushler Vue] Connecting to:', wsUrl);\n socket = new WebSocket(wsUrl);\n setupSocketHandlers();\n } catch (err) {\n console.error('[Pushler Vue] Connection error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = err.message;\n }\n }\n \n /**\n * Настройка обработчиков WebSocket\n */\n function setupSocketHandlers() {\n socket.onopen = () => {\n console.log('[Pushler Vue] WebSocket opened, waiting for connection_established...');\n };\n \n socket.onmessage = (event) => {\n handleMessage(event);\n };\n \n socket.onclose = (event) => {\n console.log('[Pushler Vue] WebSocket closed:', event.code, event.reason);\n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n \n // Автопереподключение\n if (event.code !== 1000 && reconnectAttempts.value < config.maxReconnectAttempts) {\n scheduleReconnect();\n }\n };\n \n socket.onerror = (err) => {\n console.error('[Pushler Vue] WebSocket error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = 'Connection failed';\n };\n }\n \n /**\n * Обработка входящих сообщений\n */\n function handleMessage(event) {\n try {\n // Поддержка нескольких сообщений в одном event\n const messages = event.data.trim().split('\\n').filter(line => line.trim());\n \n for (const msgData of messages) {\n processMessage(JSON.parse(msgData));\n }\n } catch (err) {\n console.error('[Pushler Vue] Error parsing message:', err);\n }\n }\n \n /**\n * Обработка отдельного сообщения\n */\n function processMessage(message) {\n switch (message.event) {\n case 'pushler:connection_established':\n handleConnectionEstablished(message.data);\n break;\n case 'pushler:subscription_succeeded':\n handleSubscriptionSucceeded(message);\n break;\n case 'pushler:auth_success':\n handleAuthSuccess(message);\n break;\n case 'pushler:auth_error':\n handleAuthError(message);\n break;\n default:\n handleChannelMessage(message);\n }\n }\n \n /**\n * Обработка установления соединения\n */\n function handleConnectionEstablished(data) {\n socketId.value = data.socket_id;\n connectionState.value = ConnectionStates.CONNECTED;\n reconnectAttempts.value = 0;\n \n console.log('[Pushler Vue] Connected with socket ID:', socketId.value);\n \n // Переподписка на все каналы\n resubscribeAllChannels();\n \n emit('connected', { socketId: socketId.value });\n }\n \n /**\n * Переподписка на все каналы\n */\n function resubscribeAllChannels() {\n for (const [name, channel] of channels.entries()) {\n channel.subscribed = false;\n performChannelSubscription(channel);\n }\n }\n \n /**\n * Обработка успешной подписки\n */\n function handleSubscriptionSucceeded(message) {\n const channel = channels.get(message.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data || {});\n }\n }\n \n /**\n * Обработка успешной авторизации\n */\n function handleAuthSuccess(message) {\n const channel = channels.get(message.data.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data);\n }\n emit('auth_success', message.data);\n }\n \n /**\n * Обработка ошибки авторизации\n */\n function handleAuthError(message) {\n error.value = message.data.error;\n emit('auth_error', message.data);\n }\n \n /**\n * Обработка сообщения канала\n */\n function handleChannelMessage(message) {\n const { channel: channelName, event, data } = message;\n const channel = channels.get(channelName);\n \n if (channel) {\n channel.emit(event, data);\n }\n \n emit('message', { \n channel: extractChannelName(channelName), \n event, \n data \n });\n }\n \n /**\n * Планирование переподключения\n */\n function scheduleReconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n }\n \n reconnectAttempts.value++;\n connectionState.value = ConnectionStates.RECONNECTING;\n \n const delay = config.reconnectDelay * reconnectAttempts.value;\n console.log(`[Pushler Vue] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${config.maxReconnectAttempts})`);\n \n reconnectTimer = setTimeout(() => {\n connect();\n }, delay);\n }\n \n /**\n * Отключение от сервера\n */\n function disconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n \n if (socket) {\n socket.close(1000, 'User disconnect');\n socket = null;\n }\n \n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n channels.clear();\n channelAliases.clear();\n reconnectAttempts.value = 0;\n \n emit('disconnected');\n }\n \n /**\n * Отправка сообщения через WebSocket\n */\n function sendMessage(message) {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n \n /**\n * Подписка на канал\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции (signature для приватных, user для presence)\n * @returns {Object} Реактивный объект канала\n */\n function subscribe(channelName, subscribeOptions = {}) {\n const fullChannelName = formatChannelName(channelName);\n \n if (channels.has(fullChannelName)) {\n return channels.get(fullChannelName);\n }\n \n // Создаем реактивный канал\n const channel = reactive({\n name: fullChannelName,\n originalName: channelName,\n type: getChannelType(channelName),\n subscribed: false,\n options: subscribeOptions,\n listeners: new Map(),\n \n // Методы канала\n on(event, callback) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event).push(callback);\n return this;\n },\n \n off(event, callback) {\n if (this.listeners.has(event)) {\n const list = this.listeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n return this;\n },\n \n emit(event, data) {\n if (this.listeners.has(event)) {\n this.listeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Channel event error:', err);\n }\n });\n }\n },\n \n unsubscribe() {\n unsubscribe(channelName);\n }\n });\n \n channels.set(fullChannelName, channel);\n channelAliases.set(channelName, fullChannelName);\n \n // Подписываемся если уже подключены\n if (connectionState.value === ConnectionStates.CONNECTED) {\n performChannelSubscription(channel);\n }\n \n return channel;\n }\n \n /**\n * Выполнение подписки на канал\n */\n async function performChannelSubscription(channel) {\n if (connectionState.value !== ConnectionStates.CONNECTED) {\n return;\n }\n \n const channelType = channel.type;\n \n // Публичные каналы\n if (channelType === ChannelTypes.PUBLIC) {\n sendMessage({\n event: 'pushler:subscribe',\n data: {\n channel: channel.name,\n app_key: config.appKey\n }\n });\n return;\n }\n \n // Приватные и presence каналы требуют авторизации\n try {\n const authData = await getAuthData(channel);\n sendMessage({\n event: 'pushler:auth',\n data: authData\n });\n } catch (err) {\n console.error('[Pushler Vue] Auth error:', err);\n error.value = err.message;\n }\n }\n \n /**\n * Получение данных авторизации для приватных/presence каналов\n * \n * Для приватных каналов подпись ДОЛЖНА быть получена с вашего бэкенда,\n * либо передана в options.signature при подписке.\n * \n * НИКОГДА не храните секретный ключ в клиентском коде!\n */\n async function getAuthData(channel) {\n if (!socketId.value) {\n throw new Error('Socket ID not available');\n }\n \n const authData = {\n app_key: config.appKey,\n channel: channel.name,\n socket_id: socketId.value\n };\n \n // Если подпись уже предоставлена в options\n if (channel.options.signature) {\n authData.signature = channel.options.signature;\n } else {\n // Запрашиваем подпись с бэкенда\n authData.signature = await fetchSignature(channel);\n }\n \n // Данные пользователя для presence каналов\n if (channel.type === ChannelTypes.PRESENCE && channel.options.user) {\n authData.user = channel.options.user;\n }\n \n return authData;\n }\n \n /**\n * Запрос подписи с бэкенда\n * \n * Ваш бэкенд должен:\n * 1. Проверить авторизацию пользователя\n * 2. Сгенерировать HMAC-SHA256 подпись с секретным ключом\n * 3. Вернуть подпись клиенту\n */\n async function fetchSignature(channel) {\n const response = await fetch(config.authEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Включаем куки для авторизации\n body: JSON.stringify({\n channel_name: channel.name,\n socket_id: socketId.value,\n app_key: config.appKey,\n user_data: channel.options.user\n })\n });\n \n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Auth request failed' }));\n throw new Error(err.error || 'Failed to get signature');\n }\n \n const data = await response.json();\n return data.signature;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n const channel = channels.get(fullChannelName);\n \n if (channel) {\n if (channel.subscribed && connectionState.value === ConnectionStates.CONNECTED) {\n sendMessage({\n event: 'pushler:unsubscribe',\n data: { channel: fullChannelName }\n });\n }\n \n channels.delete(fullChannelName);\n channelAliases.delete(channelName);\n }\n }\n \n /**\n * Получение канала по имени\n */\n function channel(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n return channels.get(fullChannelName);\n }\n \n /**\n * Получение списка каналов\n */\n function getChannels() {\n return Array.from(channels.values()).map(ch => ({\n name: ch.originalName,\n fullName: ch.name,\n type: ch.type,\n subscribed: ch.subscribed\n }));\n }\n \n /**\n * Подписка на глобальное событие\n */\n function on(event, callback) {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, []);\n }\n eventListeners.get(event).push(callback);\n }\n \n /**\n * Отписка от глобального события\n */\n function off(event, callback) {\n if (eventListeners.has(event)) {\n const list = eventListeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n }\n \n /**\n * Вызов глобального события\n */\n function emit(event, data) {\n if (eventListeners.has(event)) {\n eventListeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Event error:', err);\n }\n });\n }\n }\n \n // Автоматическое отключение при размонтировании компонента\n onUnmounted(() => {\n disconnect();\n });\n \n // Автоподключение если указано\n if (config.autoConnect && config.appKey) {\n connect();\n }\n \n return {\n // Состояние (readonly для защиты от внешних изменений)\n connectionState: readonly(connectionState),\n socketId: readonly(socketId),\n error: readonly(error),\n reconnectAttempts: readonly(reconnectAttempts),\n \n // Вычисляемые свойства\n isConnected,\n isConnecting,\n isReconnecting,\n \n // Методы\n connect,\n disconnect,\n subscribe,\n unsubscribe,\n channel,\n getChannels,\n on,\n off,\n \n // Утилиты\n formatChannelName,\n extractChannelName,\n getChannelType,\n \n // Константы\n ConnectionStates,\n ChannelTypes,\n };\n}\n\nexport default usePushler;\n","import { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\n\n/**\n * Символ для инъекции Pushler\n */\nexport const PushlerKey = Symbol('pushler');\n\n/**\n * Vue Plugin для глобальной инициализации Pushler\n * \n * Использование:\n * \n * ```js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * wsUrl: 'wss://ws.pushler.ru/app',\n * autoConnect: true\n * });\n * ```\n * \n * Затем в компонентах:\n * \n * ```js\n * import { inject } from 'vue';\n * import { PushlerKey } from '@pushler/vue';\n * \n * const pushler = inject(PushlerKey);\n * ```\n */\nexport const PushlerPlugin = {\n install(app, options = {}) {\n // Создаем глобальный инстанс Pushler\n const pushler = usePushler(options);\n \n // Предоставляем через provide/inject\n app.provide(PushlerKey, pushler);\n \n // Также добавляем как глобальное свойство (для Options API)\n app.config.globalProperties.$pushler = pushler;\n \n // Экспортируем константы\n app.config.globalProperties.$PushlerConnectionStates = ConnectionStates;\n app.config.globalProperties.$PushlerChannelTypes = ChannelTypes;\n }\n};\n\n/**\n * Хелпер для получения инстанса Pushler в setup()\n */\nexport function usePushlerInstance() {\n const pushler = inject(PushlerKey);\n if (!pushler) {\n throw new Error(\n '[Pushler Vue] No Pushler instance found. ' +\n 'Make sure to install PushlerPlugin or provide a Pushler instance.'\n );\n }\n return pushler;\n}\n\nexport default PushlerPlugin;\n","import { ref, reactive, onUnmounted, watch } from 'vue';\n\n/**\n * Vue composable для работы с отдельным каналом Pushler\n * \n * Можно использовать автономно или совместно с usePushler\n * \n * @param {Object} pushler - Инстанс usePushler\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции канала\n * @returns {Object} Реактивный объект канала с событиями\n */\nexport function usePushlerChannel(pushler, channelName, options = {}) {\n const channel = ref(null);\n const isSubscribed = ref(false);\n const lastEvent = ref(null);\n const events = reactive([]);\n const eventHandlers = new Map();\n \n /**\n * Максимальное количество событий в буфере\n */\n const maxEvents = options.maxEvents || 100;\n \n /**\n * Подписка на канал\n */\n function subscribe() {\n if (!pushler || !channelName) return;\n \n channel.value = pushler.subscribe(channelName, options);\n \n // Отслеживаем статус подписки\n channel.value.on('subscribed', () => {\n isSubscribed.value = true;\n });\n \n return channel.value;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe() {\n if (pushler && channelName) {\n pushler.unsubscribe(channelName);\n channel.value = null;\n isSubscribed.value = false;\n }\n }\n \n /**\n * Подписка на событие канала\n * @param {string} eventName - Имя события\n * @param {Function} callback - Обработчик\n */\n function on(eventName, callback) {\n if (!channel.value) {\n subscribe();\n }\n \n const handler = (data) => {\n // Сохраняем последнее событие\n lastEvent.value = {\n event: eventName,\n data,\n timestamp: new Date()\n };\n \n // Добавляем в буфер событий\n events.unshift(lastEvent.value);\n if (events.length > maxEvents) {\n events.pop();\n }\n \n // Вызываем пользовательский обработчик\n callback(data);\n };\n \n eventHandlers.set(eventName, handler);\n channel.value.on(eventName, handler);\n \n return () => off(eventName);\n }\n \n /**\n * Отписка от события канала\n */\n function off(eventName) {\n if (channel.value && eventHandlers.has(eventName)) {\n channel.value.off(eventName, eventHandlers.get(eventName));\n eventHandlers.delete(eventName);\n }\n }\n \n /**\n * Очистка буфера событий\n */\n function clearEvents() {\n events.length = 0;\n lastEvent.value = null;\n }\n \n // Автоматическая подписка если указано\n if (options.autoSubscribe !== false && pushler?.isConnected?.value) {\n subscribe();\n }\n \n // Подписываемся при подключении\n if (pushler) {\n watch(() => pushler.isConnected.value, (connected) => {\n if (connected && options.autoSubscribe !== false && !channel.value) {\n subscribe();\n }\n });\n }\n \n // Автоматическая отписка при размонтировании\n onUnmounted(() => {\n unsubscribe();\n });\n \n return {\n channel,\n isSubscribed,\n lastEvent,\n events,\n \n subscribe,\n unsubscribe,\n on,\n off,\n clearEvents,\n };\n}\n\nexport default usePushlerChannel;\n"],"names":["ConnectionStates","CONNECTING","CONNECTED","DISCONNECTED","RECONNECTING","FAILED","ChannelTypes","PUBLIC","PRIVATE","PRESENCE","usePushler","options","connectionState","ref","socketId","error","reconnectAttempts","channels","reactive","Map","channelAliases","socket","reconnectTimer","eventListeners","config","appKey","wsUrl","authEndpoint","autoConnect","reconnectDelay","maxReconnectAttempts","isConnected","computed","value","isConnecting","isReconnecting","formatChannelName","channelName","startsWith","extractChannelName","fullChannelName","prefix","substring","length","getChannelType","baseName","connect","connectOptions","endsWith","console","log","WebSocket","onopen","onmessage","event","messages","data","trim","split","filter","line","msgData","processMessage","JSON","parse","err","handleMessage","onclose","code","reason","clearTimeout","delay","setTimeout","scheduleReconnect","onerror","message","socket_id","name","channel","entries","subscribed","performChannelSubscription","resubscribeAllChannels","emit","get","handleSubscriptionSucceeded","handleAuthSuccess","handleAuthError","handleChannelMessage","disconnect","close","clear","sendMessage","readyState","OPEN","send","stringify","async","type","authData","Error","app_key","signature","response","fetch","method","headers","credentials","body","channel_name","user_data","user","ok","json","catch","fetchSignature","getAuthData","unsubscribe","delete","has","forEach","cb","onUnmounted","readonly","subscribe","subscribeOptions","originalName","listeners","on","callback","this","set","push","off","list","idx","indexOf","splice","getChannels","Array","from","values","map","ch","fullName","PushlerKey","Symbol","PushlerPlugin","install","app","pushler","provide","globalProperties","$pushler","$PushlerConnectionStates","$PushlerChannelTypes","isSubscribed","lastEvent","events","eventHandlers","maxEvents","eventName","autoSubscribe","watch","connected","handler","timestamp","Date","unshift","pop","clearEvents","inject"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pushler-vue.umd.min.js","sources":["../src/usePushler.js","../src/plugin.js","../src/usePushlerChannel.js"],"sourcesContent":["import { ref, reactive, readonly, onUnmounted, watch, computed } from 'vue';\n\n/**\n * Состояния подключения\n */\nexport const ConnectionStates = {\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n RECONNECTING: 'reconnecting',\n FAILED: 'failed'\n};\n\n/**\n * Типы каналов\n */\nexport const ChannelTypes = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PRESENCE: 'presence'\n};\n\n/**\n * Vue composable для работы с Pushler WebSocket\n * \n * @param {Object} options - Опции подключения\n * @param {string} options.appKey - Ключ приложения\n * @param {string} options.wsUrl - URL WebSocket сервера\n * @param {string} options.authEndpoint - Эндпоинт авторизации для приватных каналов\n * @param {boolean} options.autoConnect - Автоматическое подключение (по умолчанию false)\n * @param {number} options.reconnectDelay - Задержка переподключения в мс (по умолчанию 1000)\n * @param {number} options.maxReconnectAttempts - Максимум попыток переподключения (по умолчанию 5)\n * @returns {Object} Реактивный объект с методами и состоянием\n */\nexport function usePushler(options = {}) {\n // Реактивное состояние\n const connectionState = ref(ConnectionStates.DISCONNECTED);\n const socketId = ref(null);\n const error = ref(null);\n const reconnectAttempts = ref(0);\n \n // Каналы\n const channels = reactive(new Map());\n const channelAliases = reactive(new Map());\n \n // Внутренние переменные\n let socket = null;\n let reconnectTimer = null;\n const eventListeners = new Map();\n \n // Конфигурация\n const appKey = options.appKey || '';\n const config = {\n appKey: appKey,\n // wsUrl формируется автоматически из appKey, но можно переопределить\n wsUrl: options.wsUrl || `wss://ws.pushler.ru/app/${appKey}`,\n authEndpoint: options.authEndpoint || '/pushler/auth',\n autoConnect: options.autoConnect || false,\n reconnectDelay: options.reconnectDelay || 1000,\n maxReconnectAttempts: options.maxReconnectAttempts || 5,\n };\n \n // Вычисляемые свойства\n const isConnected = computed(() => connectionState.value === ConnectionStates.CONNECTED);\n const isConnecting = computed(() => connectionState.value === ConnectionStates.CONNECTING);\n const isReconnecting = computed(() => connectionState.value === ConnectionStates.RECONNECTING);\n \n /**\n * Форматирование имени канала с префиксом appKey\n */\n function formatChannelName(channelName) {\n if (channelName.startsWith(config.appKey + ':')) {\n return channelName;\n }\n return `${config.appKey}:${channelName}`;\n }\n \n /**\n * Извлечение оригинального имени канала\n */\n function extractChannelName(fullChannelName) {\n const prefix = config.appKey + ':';\n if (fullChannelName.startsWith(prefix)) {\n return fullChannelName.substring(prefix.length);\n }\n return fullChannelName;\n }\n \n /**\n * Определение типа канала\n */\n function getChannelType(channelName) {\n const baseName = extractChannelName(channelName);\n if (baseName.startsWith('private-')) return ChannelTypes.PRIVATE;\n if (baseName.startsWith('presence-')) return ChannelTypes.PRESENCE;\n return ChannelTypes.PUBLIC;\n }\n \n /**\n * Подключение к WebSocket серверу\n */\n function connect(connectOptions = {}) {\n // Обновляем конфигурацию если переданы новые параметры\n if (connectOptions.appKey) config.appKey = connectOptions.appKey;\n if (connectOptions.wsUrl) config.wsUrl = connectOptions.wsUrl;\n if (connectOptions.authEndpoint) config.authEndpoint = connectOptions.authEndpoint;\n \n if (connectionState.value === ConnectionStates.CONNECTED ||\n connectionState.value === ConnectionStates.CONNECTING) {\n return;\n }\n \n connectionState.value = ConnectionStates.CONNECTING;\n error.value = null;\n \n try {\n // wsUrl уже содержит appKey из конфигурации\n console.log('[Pushler Vue] Connecting to:', config.wsUrl);\n socket = new WebSocket(config.wsUrl);\n setupSocketHandlers();\n } catch (err) {\n console.error('[Pushler Vue] Connection error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = err.message;\n }\n }\n \n /**\n * Настройка обработчиков WebSocket\n */\n function setupSocketHandlers() {\n socket.onopen = () => {\n console.log('[Pushler Vue] WebSocket opened, waiting for connection_established...');\n };\n \n socket.onmessage = (event) => {\n handleMessage(event);\n };\n \n socket.onclose = (event) => {\n console.log('[Pushler Vue] WebSocket closed:', event.code, event.reason);\n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n \n // Автопереподключение\n if (event.code !== 1000 && reconnectAttempts.value < config.maxReconnectAttempts) {\n scheduleReconnect();\n }\n };\n \n socket.onerror = (err) => {\n console.error('[Pushler Vue] WebSocket error:', err);\n connectionState.value = ConnectionStates.FAILED;\n error.value = 'Connection failed';\n };\n }\n \n /**\n * Обработка входящих сообщений\n */\n function handleMessage(event) {\n try {\n // Поддержка нескольких сообщений в одном event\n const messages = event.data.trim().split('\\n').filter(line => line.trim());\n \n for (const msgData of messages) {\n processMessage(JSON.parse(msgData));\n }\n } catch (err) {\n console.error('[Pushler Vue] Error parsing message:', err);\n }\n }\n \n /**\n * Обработка отдельного сообщения\n */\n function processMessage(message) {\n switch (message.event) {\n case 'pushler:connection_established':\n handleConnectionEstablished(message.data);\n break;\n case 'pushler:subscription_succeeded':\n handleSubscriptionSucceeded(message);\n break;\n case 'pushler:auth_success':\n handleAuthSuccess(message);\n break;\n case 'pushler:auth_error':\n handleAuthError(message);\n break;\n default:\n handleChannelMessage(message);\n }\n }\n \n /**\n * Обработка установления соединения\n */\n function handleConnectionEstablished(data) {\n socketId.value = data.socket_id;\n connectionState.value = ConnectionStates.CONNECTED;\n reconnectAttempts.value = 0;\n \n console.log('[Pushler Vue] Connected with socket ID:', socketId.value);\n \n // Переподписка на все каналы\n resubscribeAllChannels();\n \n emit('connected', { socketId: socketId.value });\n }\n \n /**\n * Переподписка на все каналы\n */\n function resubscribeAllChannels() {\n for (const [name, channel] of channels.entries()) {\n channel.subscribed = false;\n performChannelSubscription(channel);\n }\n }\n \n /**\n * Обработка успешной подписки\n */\n function handleSubscriptionSucceeded(message) {\n const channel = channels.get(message.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data || {});\n }\n }\n \n /**\n * Обработка успешной авторизации\n */\n function handleAuthSuccess(message) {\n const channel = channels.get(message.data.channel);\n if (channel) {\n channel.subscribed = true;\n channel.emit('subscribed', message.data);\n }\n emit('auth_success', message.data);\n }\n \n /**\n * Обработка ошибки авторизации\n */\n function handleAuthError(message) {\n error.value = message.data.error;\n emit('auth_error', message.data);\n }\n \n /**\n * Обработка сообщения канала\n */\n function handleChannelMessage(message) {\n const { channel: channelName, event, data } = message;\n const channel = channels.get(channelName);\n \n if (channel) {\n channel.emit(event, data);\n }\n \n emit('message', { \n channel: extractChannelName(channelName), \n event, \n data \n });\n }\n \n /**\n * Планирование переподключения\n */\n function scheduleReconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n }\n \n reconnectAttempts.value++;\n connectionState.value = ConnectionStates.RECONNECTING;\n \n const delay = config.reconnectDelay * reconnectAttempts.value;\n console.log(`[Pushler Vue] Reconnecting in ${delay}ms (attempt ${reconnectAttempts.value}/${config.maxReconnectAttempts})`);\n \n reconnectTimer = setTimeout(() => {\n connect();\n }, delay);\n }\n \n /**\n * Отключение от сервера\n */\n function disconnect() {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n \n if (socket) {\n socket.close(1000, 'User disconnect');\n socket = null;\n }\n \n connectionState.value = ConnectionStates.DISCONNECTED;\n socketId.value = null;\n channels.clear();\n channelAliases.clear();\n reconnectAttempts.value = 0;\n \n emit('disconnected');\n }\n \n /**\n * Отправка сообщения через WebSocket\n */\n function sendMessage(message) {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n \n /**\n * Подписка на канал\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции (signature для приватных, user для presence)\n * @returns {Object} Реактивный объект канала\n */\n function subscribe(channelName, subscribeOptions = {}) {\n const fullChannelName = formatChannelName(channelName);\n \n if (channels.has(fullChannelName)) {\n return channels.get(fullChannelName);\n }\n \n // Создаем реактивный канал\n const channel = reactive({\n name: fullChannelName,\n originalName: channelName,\n type: getChannelType(channelName),\n subscribed: false,\n options: subscribeOptions,\n listeners: new Map(),\n \n // Методы канала\n on(event, callback) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event).push(callback);\n return this;\n },\n \n off(event, callback) {\n if (this.listeners.has(event)) {\n const list = this.listeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n return this;\n },\n \n emit(event, data) {\n if (this.listeners.has(event)) {\n this.listeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Channel event error:', err);\n }\n });\n }\n },\n \n unsubscribe() {\n unsubscribe(channelName);\n }\n });\n \n channels.set(fullChannelName, channel);\n channelAliases.set(channelName, fullChannelName);\n \n // Подписываемся если уже подключены\n if (connectionState.value === ConnectionStates.CONNECTED) {\n performChannelSubscription(channel);\n }\n \n return channel;\n }\n \n /**\n * Выполнение подписки на канал\n */\n async function performChannelSubscription(channel) {\n if (connectionState.value !== ConnectionStates.CONNECTED) {\n return;\n }\n \n const channelType = channel.type;\n \n // Публичные каналы\n if (channelType === ChannelTypes.PUBLIC) {\n sendMessage({\n event: 'pushler:subscribe',\n data: {\n channel: channel.name,\n app_key: config.appKey\n }\n });\n return;\n }\n \n // Приватные и presence каналы требуют авторизации\n try {\n const authData = await getAuthData(channel);\n sendMessage({\n event: 'pushler:auth',\n data: authData\n });\n } catch (err) {\n console.error('[Pushler Vue] Auth error:', err);\n error.value = err.message;\n }\n }\n \n /**\n * Получение данных авторизации для приватных/presence каналов\n * \n * Для приватных каналов подпись ДОЛЖНА быть получена с вашего бэкенда,\n * либо передана в options.signature при подписке.\n * \n * НИКОГДА не храните секретный ключ в клиентском коде!\n */\n async function getAuthData(channel) {\n if (!socketId.value) {\n throw new Error('Socket ID not available');\n }\n \n const authData = {\n app_key: config.appKey,\n channel: channel.name,\n socket_id: socketId.value\n };\n \n // Если подпись уже предоставлена в options\n if (channel.options.signature) {\n authData.signature = channel.options.signature;\n } else {\n // Запрашиваем подпись с бэкенда\n authData.signature = await fetchSignature(channel);\n }\n \n // Данные пользователя для presence каналов\n if (channel.type === ChannelTypes.PRESENCE && channel.options.user) {\n authData.user = channel.options.user;\n }\n \n return authData;\n }\n \n /**\n * Запрос подписи с бэкенда\n * \n * Ваш бэкенд должен:\n * 1. Проверить авторизацию пользователя\n * 2. Сгенерировать HMAC-SHA256 подпись с секретным ключом\n * 3. Вернуть подпись клиенту\n */\n async function fetchSignature(channel) {\n const response = await fetch(config.authEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include', // Включаем куки для авторизации\n body: JSON.stringify({\n channel_name: channel.name,\n socket_id: socketId.value,\n app_key: config.appKey,\n user_data: channel.options.user\n })\n });\n \n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Auth request failed' }));\n throw new Error(err.error || 'Failed to get signature');\n }\n \n const data = await response.json();\n return data.signature;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n const channel = channels.get(fullChannelName);\n \n if (channel) {\n if (channel.subscribed && connectionState.value === ConnectionStates.CONNECTED) {\n sendMessage({\n event: 'pushler:unsubscribe',\n data: { channel: fullChannelName }\n });\n }\n \n channels.delete(fullChannelName);\n channelAliases.delete(channelName);\n }\n }\n \n /**\n * Получение канала по имени\n */\n function channel(channelName) {\n const fullChannelName = channelAliases.get(channelName) || formatChannelName(channelName);\n return channels.get(fullChannelName);\n }\n \n /**\n * Получение списка каналов\n */\n function getChannels() {\n return Array.from(channels.values()).map(ch => ({\n name: ch.originalName,\n fullName: ch.name,\n type: ch.type,\n subscribed: ch.subscribed\n }));\n }\n \n /**\n * Подписка на глобальное событие\n */\n function on(event, callback) {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, []);\n }\n eventListeners.get(event).push(callback);\n }\n \n /**\n * Отписка от глобального события\n */\n function off(event, callback) {\n if (eventListeners.has(event)) {\n const list = eventListeners.get(event);\n const idx = list.indexOf(callback);\n if (idx > -1) list.splice(idx, 1);\n }\n }\n \n /**\n * Вызов глобального события\n */\n function emit(event, data) {\n if (eventListeners.has(event)) {\n eventListeners.get(event).forEach(cb => {\n try {\n cb(data);\n } catch (err) {\n console.error('[Pushler Vue] Event error:', err);\n }\n });\n }\n }\n \n // Автоматическое отключение при размонтировании компонента\n onUnmounted(() => {\n disconnect();\n });\n \n // Автоподключение если указано\n if (config.autoConnect && config.appKey) {\n connect();\n }\n \n return {\n // Состояние (readonly для защиты от внешних изменений)\n connectionState: readonly(connectionState),\n socketId: readonly(socketId),\n error: readonly(error),\n reconnectAttempts: readonly(reconnectAttempts),\n \n // Вычисляемые свойства\n isConnected,\n isConnecting,\n isReconnecting,\n \n // Методы\n connect,\n disconnect,\n subscribe,\n unsubscribe,\n channel,\n getChannels,\n on,\n off,\n \n // Утилиты\n formatChannelName,\n extractChannelName,\n getChannelType,\n \n // Константы\n ConnectionStates,\n ChannelTypes,\n };\n}\n\nexport default usePushler;\n","import { usePushler, ConnectionStates, ChannelTypes } from './usePushler';\n\n/**\n * Символ для инъекции Pushler\n */\nexport const PushlerKey = Symbol('pushler');\n\n/**\n * Vue Plugin для глобальной инициализации Pushler\n * \n * Использование:\n * \n * ```js\n * import { createApp } from 'vue';\n * import { PushlerPlugin } from '@pushler/vue';\n * \n * const app = createApp(App);\n * app.use(PushlerPlugin, {\n * appKey: 'your-app-key',\n * autoConnect: true\n * });\n * ```\n * \n * Затем в компонентах:\n * \n * ```js\n * import { inject } from 'vue';\n * import { PushlerKey } from '@pushler/vue';\n * \n * const pushler = inject(PushlerKey);\n * ```\n */\nexport const PushlerPlugin = {\n install(app, options = {}) {\n // Создаем глобальный инстанс Pushler\n const pushler = usePushler(options);\n \n // Предоставляем через provide/inject\n app.provide(PushlerKey, pushler);\n \n // Также добавляем как глобальное свойство (для Options API)\n app.config.globalProperties.$pushler = pushler;\n \n // Экспортируем константы\n app.config.globalProperties.$PushlerConnectionStates = ConnectionStates;\n app.config.globalProperties.$PushlerChannelTypes = ChannelTypes;\n }\n};\n\n/**\n * Хелпер для получения инстанса Pushler в setup()\n */\nexport function usePushlerInstance() {\n const pushler = inject(PushlerKey);\n if (!pushler) {\n throw new Error(\n '[Pushler Vue] No Pushler instance found. ' +\n 'Make sure to install PushlerPlugin or provide a Pushler instance.'\n );\n }\n return pushler;\n}\n\nexport default PushlerPlugin;\n","import { ref, reactive, onUnmounted, watch } from 'vue';\n\n/**\n * Vue composable для работы с отдельным каналом Pushler\n * \n * Можно использовать автономно или совместно с usePushler\n * \n * @param {Object} pushler - Инстанс usePushler\n * @param {string} channelName - Имя канала\n * @param {Object} options - Опции канала\n * @returns {Object} Реактивный объект канала с событиями\n */\nexport function usePushlerChannel(pushler, channelName, options = {}) {\n const channel = ref(null);\n const isSubscribed = ref(false);\n const lastEvent = ref(null);\n const events = reactive([]);\n const eventHandlers = new Map();\n \n /**\n * Максимальное количество событий в буфере\n */\n const maxEvents = options.maxEvents || 100;\n \n /**\n * Подписка на канал\n */\n function subscribe() {\n if (!pushler || !channelName) return;\n \n channel.value = pushler.subscribe(channelName, options);\n \n // Отслеживаем статус подписки\n channel.value.on('subscribed', () => {\n isSubscribed.value = true;\n });\n \n return channel.value;\n }\n \n /**\n * Отписка от канала\n */\n function unsubscribe() {\n if (pushler && channelName) {\n pushler.unsubscribe(channelName);\n channel.value = null;\n isSubscribed.value = false;\n }\n }\n \n /**\n * Подписка на событие канала\n * @param {string} eventName - Имя события\n * @param {Function} callback - Обработчик\n */\n function on(eventName, callback) {\n if (!channel.value) {\n subscribe();\n }\n \n const handler = (data) => {\n // Сохраняем последнее событие\n lastEvent.value = {\n event: eventName,\n data,\n timestamp: new Date()\n };\n \n // Добавляем в буфер событий\n events.unshift(lastEvent.value);\n if (events.length > maxEvents) {\n events.pop();\n }\n \n // Вызываем пользовательский обработчик\n callback(data);\n };\n \n eventHandlers.set(eventName, handler);\n channel.value.on(eventName, handler);\n \n return () => off(eventName);\n }\n \n /**\n * Отписка от события канала\n */\n function off(eventName) {\n if (channel.value && eventHandlers.has(eventName)) {\n channel.value.off(eventName, eventHandlers.get(eventName));\n eventHandlers.delete(eventName);\n }\n }\n \n /**\n * Очистка буфера событий\n */\n function clearEvents() {\n events.length = 0;\n lastEvent.value = null;\n }\n \n // Автоматическая подписка если указано\n if (options.autoSubscribe !== false && pushler?.isConnected?.value) {\n subscribe();\n }\n \n // Подписываемся при подключении\n if (pushler) {\n watch(() => pushler.isConnected.value, (connected) => {\n if (connected && options.autoSubscribe !== false && !channel.value) {\n subscribe();\n }\n });\n }\n \n // Автоматическая отписка при размонтировании\n onUnmounted(() => {\n unsubscribe();\n });\n \n return {\n channel,\n isSubscribed,\n lastEvent,\n events,\n \n subscribe,\n unsubscribe,\n on,\n off,\n clearEvents,\n };\n}\n\nexport default usePushlerChannel;\n"],"names":["ConnectionStates","CONNECTING","CONNECTED","DISCONNECTED","RECONNECTING","FAILED","ChannelTypes","PUBLIC","PRIVATE","PRESENCE","usePushler","options","connectionState","ref","socketId","error","reconnectAttempts","channels","reactive","Map","channelAliases","socket","reconnectTimer","eventListeners","appKey","config","wsUrl","authEndpoint","autoConnect","reconnectDelay","maxReconnectAttempts","isConnected","computed","value","isConnecting","isReconnecting","formatChannelName","channelName","startsWith","extractChannelName","fullChannelName","prefix","substring","length","getChannelType","baseName","connect","connectOptions","console","log","WebSocket","onopen","onmessage","event","messages","data","trim","split","filter","line","msgData","processMessage","JSON","parse","err","handleMessage","onclose","code","reason","clearTimeout","delay","setTimeout","scheduleReconnect","onerror","message","socket_id","name","channel","entries","subscribed","performChannelSubscription","resubscribeAllChannels","emit","get","handleSubscriptionSucceeded","handleAuthSuccess","handleAuthError","handleChannelMessage","disconnect","close","clear","sendMessage","readyState","OPEN","send","stringify","async","type","authData","Error","app_key","signature","response","fetch","method","headers","credentials","body","channel_name","user_data","user","ok","json","catch","fetchSignature","getAuthData","unsubscribe","delete","has","forEach","cb","onUnmounted","readonly","subscribe","subscribeOptions","originalName","listeners","on","callback","this","set","push","off","list","idx","indexOf","splice","getChannels","Array","from","values","map","ch","fullName","PushlerKey","Symbol","PushlerPlugin","install","app","pushler","provide","globalProperties","$pushler","$PushlerConnectionStates","$PushlerChannelTypes","isSubscribed","lastEvent","events","eventHandlers","maxEvents","eventName","autoSubscribe","watch","connected","handler","timestamp","Date","unshift","pop","clearEvents","inject"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pushler/vue",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Vue.js SDK for Pushler.ru real-time messaging",
|
|
6
6
|
"main": "dist/pushler-vue.cjs.js",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
],
|
|
39
39
|
"author": "Pushler.ru <support@pushler.ru>",
|
|
40
40
|
"license": "MIT",
|
|
41
|
-
"homepage": "https://pushler.ru/docs",
|
|
41
|
+
"homepage": "https://pushler.ru/docs#vue-sdk",
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"vue": "^3.0.0"
|
|
44
44
|
},
|
package/src/index.js
CHANGED
|
@@ -9,8 +9,7 @@
|
|
|
9
9
|
* import { usePushler } from '@pushler/vue';
|
|
10
10
|
*
|
|
11
11
|
* const pushler = usePushler({
|
|
12
|
-
* appKey: 'your-app-key'
|
|
13
|
-
* wsUrl: 'wss://ws.pushler.ru/app'
|
|
12
|
+
* appKey: 'your-app-key'
|
|
14
13
|
* });
|
|
15
14
|
*
|
|
16
15
|
* // Подключение
|
|
@@ -40,7 +39,6 @@
|
|
|
40
39
|
* const app = createApp(App);
|
|
41
40
|
* app.use(PushlerPlugin, {
|
|
42
41
|
* appKey: 'your-app-key',
|
|
43
|
-
* wsUrl: 'wss://ws.pushler.ru/app',
|
|
44
42
|
* autoConnect: true
|
|
45
43
|
* });
|
|
46
44
|
* ```
|
package/src/plugin.js
CHANGED
package/src/usePushler.js
CHANGED
|
@@ -49,9 +49,11 @@ export function usePushler(options = {}) {
|
|
|
49
49
|
const eventListeners = new Map();
|
|
50
50
|
|
|
51
51
|
// Конфигурация
|
|
52
|
+
const appKey = options.appKey || '';
|
|
52
53
|
const config = {
|
|
53
|
-
appKey:
|
|
54
|
-
|
|
54
|
+
appKey: appKey,
|
|
55
|
+
// wsUrl формируется автоматически из appKey, но можно переопределить
|
|
56
|
+
wsUrl: options.wsUrl || `wss://ws.pushler.ru/app/${appKey}`,
|
|
55
57
|
authEndpoint: options.authEndpoint || '/pushler/auth',
|
|
56
58
|
autoConnect: options.autoConnect || false,
|
|
57
59
|
reconnectDelay: options.reconnectDelay || 1000,
|
|
@@ -112,13 +114,9 @@ export function usePushler(options = {}) {
|
|
|
112
114
|
error.value = null;
|
|
113
115
|
|
|
114
116
|
try {
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
: `${config.wsUrl}/${config.appKey}`;
|
|
119
|
-
|
|
120
|
-
console.log('[Pushler Vue] Connecting to:', wsUrl);
|
|
121
|
-
socket = new WebSocket(wsUrl);
|
|
117
|
+
// wsUrl уже содержит appKey из конфигурации
|
|
118
|
+
console.log('[Pushler Vue] Connecting to:', config.wsUrl);
|
|
119
|
+
socket = new WebSocket(config.wsUrl);
|
|
122
120
|
setupSocketHandlers();
|
|
123
121
|
} catch (err) {
|
|
124
122
|
console.error('[Pushler Vue] Connection error:', err);
|