@pushler/js 1.0.0

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 ADDED
@@ -0,0 +1,243 @@
1
+ # @pushler/js
2
+
3
+ JavaScript SDK для [Pushler.ru](https://pushler.ru) — сервиса real-time сообщений через WebSocket.
4
+
5
+ ## Установка
6
+
7
+ ```bash
8
+ npm install @pushler/js
9
+ ```
10
+
11
+ Или через CDN:
12
+
13
+ ```html
14
+ <script src="https://cdn.jsdelivr.net/npm/@pushler/js/dist/pushler-ru.min.js"></script>
15
+ ```
16
+
17
+ ## Быстрый старт
18
+
19
+ ### Браузер (WebSocket клиент)
20
+
21
+ ```javascript
22
+ import Pushler from '@pushler/js';
23
+
24
+ // Создание клиента
25
+ const pushler = Pushler.Create({
26
+ appKey: 'your-app-key',
27
+ wsUrl: 'wss://pushler.ru/ws',
28
+ apiUrl: 'https://api.pushler.ru'
29
+ });
30
+
31
+ // Обработка событий подключения
32
+ pushler.on('connected', ({ socketId }) => {
33
+ console.log('Подключено! Socket ID:', socketId);
34
+ });
35
+
36
+ pushler.on('error', (error) => {
37
+ console.error('Ошибка:', error.message);
38
+ });
39
+
40
+ // Подписка на публичный канал
41
+ const channel = pushler.subscribe('my-channel');
42
+
43
+ channel.on('channel_subscribed', () => {
44
+ console.log('Подписка успешна!');
45
+ });
46
+
47
+ // Получение сообщений
48
+ channel.on('new-message', (data) => {
49
+ console.log('Новое сообщение:', data);
50
+ });
51
+ ```
52
+
53
+ ### Node.js (Серверный SDK)
54
+
55
+ ```javascript
56
+ import Pushler from '@pushler/js';
57
+
58
+ // Создание серверного клиента
59
+ const server = Pushler.Server({
60
+ appKey: 'your-app-key',
61
+ appSecret: 'your-app-secret',
62
+ apiUrl: 'https://api.pushler.ru'
63
+ });
64
+
65
+ // Отправка сообщения в канал
66
+ await server.trigger('my-channel', 'new-message', {
67
+ text: 'Привет, мир!',
68
+ timestamp: Date.now()
69
+ });
70
+
71
+ // Отправка в несколько каналов
72
+ await server.trigger(
73
+ ['channel-1', 'channel-2'],
74
+ 'notification',
75
+ { message: 'Важное уведомление!' }
76
+ );
77
+ ```
78
+
79
+ ## API
80
+
81
+ ### PushlerClient (браузер)
82
+
83
+ #### Создание клиента
84
+
85
+ ```javascript
86
+ const pushler = Pushler.Create({
87
+ appKey: 'your-app-key', // Обязательно
88
+ wsUrl: 'wss://pushler.ru/ws', // URL WebSocket сервера
89
+ apiUrl: 'https://api.pushler.ru', // URL API сервера
90
+ authEndpoint: '/pushler/auth', // Путь для авторизации приватных каналов
91
+ autoConnect: true, // Автоподключение (по умолчанию: true)
92
+ reconnectDelay: 1000, // Задержка переподключения (мс)
93
+ maxReconnectAttempts: 5 // Максимум попыток переподключения
94
+ });
95
+ ```
96
+
97
+ #### Методы
98
+
99
+ | Метод | Описание |
100
+ |-------|----------|
101
+ | `connect()` | Подключиться к серверу |
102
+ | `disconnect()` | Отключиться от сервера |
103
+ | `subscribe(channelName, options?)` | Подписаться на канал |
104
+ | `unsubscribe(channelName)` | Отписаться от канала |
105
+ | `channel(channelName)` | Получить объект канала |
106
+ | `getChannels()` | Список подписанных каналов |
107
+ | `getConnectionState()` | Текущее состояние подключения |
108
+
109
+ #### События
110
+
111
+ | Событие | Данные | Описание |
112
+ |---------|--------|----------|
113
+ | `connected` | `{ socketId }` | Подключение установлено |
114
+ | `disconnected` | `event` | Подключение разорвано |
115
+ | `connection_state_changed` | `state` | Изменение состояния |
116
+ | `error` | `{ code, message }` | Ошибка |
117
+ | `message_received` | `{ channel, event, data }` | Получено сообщение |
118
+
119
+ ### Channel (канал)
120
+
121
+ #### Методы
122
+
123
+ | Метод | Описание |
124
+ |-------|----------|
125
+ | `on(event, callback)` | Подписка на событие |
126
+ | `off(event, callback)` | Отписка от события |
127
+ | `unsubscribe()` | Отписаться от канала |
128
+ | `isSubscribed()` | Проверка подписки |
129
+ | `getType()` | Тип канала (public/private/presence) |
130
+
131
+ ### PushlerServer (Node.js)
132
+
133
+ #### Создание сервера
134
+
135
+ ```javascript
136
+ const server = Pushler.Server({
137
+ appKey: 'your-app-key', // Обязательно
138
+ appSecret: 'your-app-secret', // Обязательно
139
+ apiUrl: 'https://api.pushler.ru', // URL API
140
+ timeout: 30000 // Таймаут запросов (мс)
141
+ });
142
+ ```
143
+
144
+ #### Методы
145
+
146
+ | Метод | Описание |
147
+ |-------|----------|
148
+ | `trigger(channels, event, data, socketId?)` | Отправить событие в канал(ы) |
149
+ | `authorizeChannel(channelName, socketId)` | Авторизация приватного канала |
150
+ | `authorizePresenceChannel(channelName, socketId, userData)` | Авторизация presence канала |
151
+ | `verifyWebhook(headers, body)` | Проверка подписи вебхука |
152
+ | `getMessageStatus(messageId)` | Статус сообщения |
153
+ | `getMessages(params?)` | Список сообщений |
154
+
155
+ ## Типы каналов
156
+
157
+ ### Публичные каналы
158
+
159
+ Доступны всем без авторизации:
160
+
161
+ ```javascript
162
+ const channel = pushler.subscribe('news');
163
+ ```
164
+
165
+ ### Приватные каналы
166
+
167
+ Требуют авторизации на вашем сервере:
168
+
169
+ ```javascript
170
+ const channel = pushler.subscribe('private-user-123');
171
+ ```
172
+
173
+ ### Presence каналы
174
+
175
+ Для отслеживания онлайн-пользователей:
176
+
177
+ ```javascript
178
+ const channel = pushler.subscribe('presence-room-1', {
179
+ user: { id: 'user-123', name: 'Иван' }
180
+ });
181
+ ```
182
+
183
+ ## Авторизация каналов
184
+
185
+ Для приватных и presence каналов настройте endpoint авторизации на вашем сервере:
186
+
187
+ ```javascript
188
+ // Express.js пример
189
+ app.post('/pushler/auth', (req, res) => {
190
+ const { channel_name, socket_id, app_key, user_data } = req.body;
191
+
192
+ // Проверьте права пользователя на доступ к каналу
193
+ const server = Pushler.Server({
194
+ appKey: process.env.PUSHLER_KEY,
195
+ appSecret: process.env.PUSHLER_SECRET
196
+ });
197
+
198
+ if (channel_name.startsWith('presence-')) {
199
+ const auth = server.authorizePresenceChannel(channel_name, socket_id, user_data);
200
+ res.json(auth);
201
+ } else {
202
+ const auth = server.authorizeChannel(channel_name, socket_id);
203
+ res.json(auth);
204
+ }
205
+ });
206
+ ```
207
+
208
+ ## Вебхуки
209
+
210
+ Проверка подписи входящих вебхуков:
211
+
212
+ ```javascript
213
+ app.post('/webhooks/pushler', (req, res) => {
214
+ try {
215
+ const data = server.verifyWebhook(req.headers, req.rawBody);
216
+ console.log('Получен вебхук:', data);
217
+ res.sendStatus(200);
218
+ } catch (error) {
219
+ console.error('Невалидный вебхук:', error);
220
+ res.sendStatus(403);
221
+ }
222
+ });
223
+ ```
224
+
225
+ ## Примеры
226
+
227
+ Смотрите папку `examples/` для полных примеров:
228
+
229
+ - `basic.html` — базовый пример в браузере
230
+ - `advanced.html` — продвинутый пример с приватными каналами
231
+ - `send-message.mjs` — отправка сообщений из Node.js
232
+ - `auth-channel.mjs` — авторизация каналов
233
+
234
+ ## Поддержка браузеров
235
+
236
+ - Chrome 49+
237
+ - Firefox 52+
238
+ - Safari 10+
239
+ - Edge 14+
240
+
241
+ ## Лицензия
242
+
243
+ MIT © [Pushler.ru](https://pushler.ru)