@cendarsoss/pusher-js 8.4.11

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.
Files changed (425) hide show
  1. package/.editorconfig +14 -0
  2. package/.github/ISSUE_TEMPLATE.md +11 -0
  3. package/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  4. package/.github/dependabot.yml +14 -0
  5. package/.github/stale.yml +26 -0
  6. package/.github/workflows/release.yml +112 -0
  7. package/.github/workflows/release_pr.yml +43 -0
  8. package/.github/workflows/run-tests.yml +62 -0
  9. package/.gitmodules +3 -0
  10. package/.prettierrc +2 -0
  11. package/CHANGELOG.md +928 -0
  12. package/DELTA_COMPRESSION.md +365 -0
  13. package/DELTA_USAGE.md +179 -0
  14. package/IMPLEMENTATION_SUMMARY.md +261 -0
  15. package/IMPORT_GUIDE.md +638 -0
  16. package/LIBRARY_STRUCTURE_ANALYSIS.md +940 -0
  17. package/LICENCE +19 -0
  18. package/Makefile +14 -0
  19. package/README.md +709 -0
  20. package/TAG_FILTERING_CLIENT.md +471 -0
  21. package/bower.json +19 -0
  22. package/bun.lock +2695 -0
  23. package/dist/node/filter.js +252 -0
  24. package/dist/node/filter.js.map +1 -0
  25. package/dist/node/pusher.js +4434 -0
  26. package/dist/node/pusher.js.map +1 -0
  27. package/dist/web/filter.mjs +252 -0
  28. package/dist/web/filter.mjs.map +1 -0
  29. package/dist/web/pusher.mjs +5889 -0
  30. package/dist/web/pusher.mjs.map +1 -0
  31. package/examples/delta-compression-example.html +372 -0
  32. package/examples/delta-seamless-example.html +185 -0
  33. package/index.d.ts +36 -0
  34. package/integration_tests_server/index.js +176 -0
  35. package/integration_tests_server/package-lock.json +1177 -0
  36. package/integration_tests_server/package.json +15 -0
  37. package/interactive/.env +16 -0
  38. package/interactive/CONFLATION_TEST.md +73 -0
  39. package/interactive/DELTA_COMPRESSION_TESTING.md +262 -0
  40. package/interactive/bun.lock +208 -0
  41. package/interactive/package-lock.json +1075 -0
  42. package/interactive/package.json +32 -0
  43. package/interactive/public/app.js +1363 -0
  44. package/interactive/public/bundle-entry.js +14 -0
  45. package/interactive/public/conflation-test.html +508 -0
  46. package/interactive/public/conflation-test.js +785 -0
  47. package/interactive/public/delta-compression.js +1090 -0
  48. package/interactive/public/dist/bundle.js +5857 -0
  49. package/interactive/public/index.html +392 -0
  50. package/interactive/public/main.js +20 -0
  51. package/interactive/public/style.css +823 -0
  52. package/interactive/server.js +246 -0
  53. package/interactive/test-bundle.html +89 -0
  54. package/interactive/test-delta.js +146 -0
  55. package/node.js +1 -0
  56. package/package.json +94 -0
  57. package/pusher-with-encryption/index.js +1 -0
  58. package/react-native/index.d.ts +29 -0
  59. package/react-native/index.js +1 -0
  60. package/spec/config/jasmine/helpers/reporter.js +14 -0
  61. package/spec/config/jasmine/integration.json +13 -0
  62. package/spec/config/jasmine/unit.json +13 -0
  63. package/spec/config/jasmine/webpack.integration.js +33 -0
  64. package/spec/config/jasmine/webpack.unit.js +30 -0
  65. package/spec/config/karma/available_browsers.json +4957 -0
  66. package/spec/config/karma/config.ci.js +25 -0
  67. package/spec/config/karma/config.common.js +50 -0
  68. package/spec/config/karma/config.integration.js +26 -0
  69. package/spec/config/karma/config.unit.js +10 -0
  70. package/spec/config/karma/config.worker.js +34 -0
  71. package/spec/config/karma/integration.js +24 -0
  72. package/spec/config/karma/unit.js +20 -0
  73. package/spec/javascripts/helpers/mocks.js +274 -0
  74. package/spec/javascripts/helpers/node/integration.js +33 -0
  75. package/spec/javascripts/helpers/node/mock-dom-dependencies.ts +1 -0
  76. package/spec/javascripts/helpers/pusher_integration.js +1 -0
  77. package/spec/javascripts/helpers/pusher_integration_class.ts +12 -0
  78. package/spec/javascripts/helpers/timers/promises.js +9 -0
  79. package/spec/javascripts/helpers/waitsFor.js +37 -0
  80. package/spec/javascripts/helpers/web/integration.js +44 -0
  81. package/spec/javascripts/helpers/worker/mock-dom-dependencies.js +1 -0
  82. package/spec/javascripts/integration/core/cluster_config_spec.js +153 -0
  83. package/spec/javascripts/integration/core/falling_back_spec.js +195 -0
  84. package/spec/javascripts/integration/core/pusher_spec/index.js +68 -0
  85. package/spec/javascripts/integration/core/pusher_spec/test_builder.js +715 -0
  86. package/spec/javascripts/integration/core/timeout_configuration_spec.js +200 -0
  87. package/spec/javascripts/integration/core/transport_lists_spec.js +103 -0
  88. package/spec/javascripts/integration/index.node.js +12 -0
  89. package/spec/javascripts/integration/index.web.js +63 -0
  90. package/spec/javascripts/integration/index.worker.js +13 -0
  91. package/spec/javascripts/integration/web/dom/jsonp_spec.js +97 -0
  92. package/spec/javascripts/integration/web/dom/script_request_spec.js +90 -0
  93. package/spec/javascripts/polyfills/index.js +105 -0
  94. package/spec/javascripts/unit/core/channels/channel_spec.js +355 -0
  95. package/spec/javascripts/unit/core/channels/channels_spec.js +94 -0
  96. package/spec/javascripts/unit/core/channels/encrypted_channel_spec.js +343 -0
  97. package/spec/javascripts/unit/core/channels/presence_channel_spec.js +553 -0
  98. package/spec/javascripts/unit/core/channels/private_channel_spec.js +182 -0
  99. package/spec/javascripts/unit/core/config_spec.js +507 -0
  100. package/spec/javascripts/unit/core/connection/connection_manager_spec.js +656 -0
  101. package/spec/javascripts/unit/core/connection/connection_spec.js +286 -0
  102. package/spec/javascripts/unit/core/connection/handshake_spec.js +160 -0
  103. package/spec/javascripts/unit/core/connection/protocol_spec.js +420 -0
  104. package/spec/javascripts/unit/core/defaults_spec.js +26 -0
  105. package/spec/javascripts/unit/core/events_dispatcher_spec.js +385 -0
  106. package/spec/javascripts/unit/core/http/http_polling_socket_spec.js +60 -0
  107. package/spec/javascripts/unit/core/http/http_request_spec.js +185 -0
  108. package/spec/javascripts/unit/core/http/http_socket_spec.js +370 -0
  109. package/spec/javascripts/unit/core/http/http_streaming_socket_spec.js +56 -0
  110. package/spec/javascripts/unit/core/http/http_xhr_request_spec.js +164 -0
  111. package/spec/javascripts/unit/core/logger_spec.js +133 -0
  112. package/spec/javascripts/unit/core/pusher_spec.js +613 -0
  113. package/spec/javascripts/unit/core/pusher_with_encryption_spec.js +18 -0
  114. package/spec/javascripts/unit/core/strategies/best_connected_ever_strategy_spec.js +104 -0
  115. package/spec/javascripts/unit/core/strategies/delayed_strategy_spec.js +95 -0
  116. package/spec/javascripts/unit/core/strategies/first_connected_strategy_spec.js +68 -0
  117. package/spec/javascripts/unit/core/strategies/if_strategy_spec.js +165 -0
  118. package/spec/javascripts/unit/core/strategies/sequential_strategy_spec.js +213 -0
  119. package/spec/javascripts/unit/core/strategies/transport_strategy_spec.js +250 -0
  120. package/spec/javascripts/unit/core/strategies/websocket_prioritized_cached_strategy_spec.js +400 -0
  121. package/spec/javascripts/unit/core/timeline/timeline_spec.js +153 -0
  122. package/spec/javascripts/unit/core/transports/assistant_to_the_transport_manager_spec.js +223 -0
  123. package/spec/javascripts/unit/core/transports/hosts_and_ports_spec.js +85 -0
  124. package/spec/javascripts/unit/core/transports/transport_connection_spec.js +585 -0
  125. package/spec/javascripts/unit/core/transports/transport_manager_spec.js +64 -0
  126. package/spec/javascripts/unit/core/user_spec.js +303 -0
  127. package/spec/javascripts/unit/core/utils/periodic_timer_spec.js +74 -0
  128. package/spec/javascripts/unit/core/utils/timers_spec.js +157 -0
  129. package/spec/javascripts/unit/core/utils/url_store_spec.js +14 -0
  130. package/spec/javascripts/unit/core/watchlist_spec.js +48 -0
  131. package/spec/javascripts/unit/core_with_runtime/auth/channel_authorizer_spec.js +137 -0
  132. package/spec/javascripts/unit/core_with_runtime/auth/deprecated_channel_authorizer_spec.js +48 -0
  133. package/spec/javascripts/unit/core_with_runtime/auth/user_authorizer_spec.js +128 -0
  134. package/spec/javascripts/unit/core_with_runtime/readme.md +5 -0
  135. package/spec/javascripts/unit/index.node.js +11 -0
  136. package/spec/javascripts/unit/index.web.js +12 -0
  137. package/spec/javascripts/unit/index.worker.js +11 -0
  138. package/spec/javascripts/unit/isomorphic/transports/hosts_and_ports_spec.js +82 -0
  139. package/spec/javascripts/unit/isomorphic/transports/transports_spec.js +202 -0
  140. package/spec/javascripts/unit/node/timeline_sender_spec.js +83 -0
  141. package/spec/javascripts/unit/web/dom/dependency_loader_spec.js +249 -0
  142. package/spec/javascripts/unit/web/dom/jsonp_request_spec.js +130 -0
  143. package/spec/javascripts/unit/web/dom/script_receiver_factory_spec.js +68 -0
  144. package/spec/javascripts/unit/web/http/http_xdomain_request_spec.js +222 -0
  145. package/spec/javascripts/unit/web/pusher_authorizer_spec.js +64 -0
  146. package/spec/javascripts/unit/web/timeline/timeline_sender_spec.js +131 -0
  147. package/spec/javascripts/unit/web/transports/hosts_and_ports_spec.js +127 -0
  148. package/spec/javascripts/unit/web/transports/transports_spec.js +444 -0
  149. package/spec/javascripts/unit/worker/channel_authorizer_spec.js +156 -0
  150. package/spec/javascripts/unit/worker/timeline_sender_spec.js +76 -0
  151. package/src/core/auth/auth_transports.ts +18 -0
  152. package/src/core/auth/channel_authorizer.ts +64 -0
  153. package/src/core/auth/deprecated_channel_authorizer.ts +56 -0
  154. package/src/core/auth/options.ts +76 -0
  155. package/src/core/auth/user_authenticator.ts +62 -0
  156. package/src/core/base64.ts +49 -0
  157. package/src/core/channels/channel.ts +173 -0
  158. package/src/core/channels/channel_table.ts +7 -0
  159. package/src/core/channels/channels.ts +86 -0
  160. package/src/core/channels/encrypted_channel.ts +150 -0
  161. package/src/core/channels/filter.ts +342 -0
  162. package/src/core/channels/members.ts +80 -0
  163. package/src/core/channels/metadata.ts +5 -0
  164. package/src/core/channels/presence_channel.ts +113 -0
  165. package/src/core/channels/private_channel.ts +25 -0
  166. package/src/core/config.ts +189 -0
  167. package/src/core/connection/callbacks.ts +21 -0
  168. package/src/core/connection/connection.ts +160 -0
  169. package/src/core/connection/connection_manager.ts +371 -0
  170. package/src/core/connection/connection_manager_options.ts +14 -0
  171. package/src/core/connection/handshake/handshake_payload.ts +10 -0
  172. package/src/core/connection/handshake/index.ts +90 -0
  173. package/src/core/connection/protocol/action.ts +8 -0
  174. package/src/core/connection/protocol/message-types.ts +11 -0
  175. package/src/core/connection/protocol/protocol.ts +166 -0
  176. package/src/core/defaults.ts +66 -0
  177. package/src/core/delta/channel_state.ts +194 -0
  178. package/src/core/delta/decoders.ts +129 -0
  179. package/src/core/delta/index.ts +10 -0
  180. package/src/core/delta/manager.ts +504 -0
  181. package/src/core/delta/types.ts +60 -0
  182. package/src/core/errors.ts +69 -0
  183. package/src/core/events/callback.ts +6 -0
  184. package/src/core/events/callback_registry.ts +75 -0
  185. package/src/core/events/callback_table.ts +7 -0
  186. package/src/core/events/dispatcher.ts +84 -0
  187. package/src/core/http/ajax.ts +24 -0
  188. package/src/core/http/http_factory.ts +16 -0
  189. package/src/core/http/http_polling_socket.ts +24 -0
  190. package/src/core/http/http_request.ts +81 -0
  191. package/src/core/http/http_socket.ts +220 -0
  192. package/src/core/http/http_streaming_socket.ts +19 -0
  193. package/src/core/http/request_hooks.ts +9 -0
  194. package/src/core/http/socket_hooks.ts +11 -0
  195. package/src/core/http/state.ts +7 -0
  196. package/src/core/http/url_location.ts +6 -0
  197. package/src/core/logger.ts +66 -0
  198. package/src/core/options.ts +61 -0
  199. package/src/core/pusher-licence.js +7 -0
  200. package/src/core/pusher-with-encryption.js +1 -0
  201. package/src/core/pusher-with-encryption.ts +14 -0
  202. package/src/core/pusher.js +10 -0
  203. package/src/core/pusher.ts +412 -0
  204. package/src/core/reachability.ts +7 -0
  205. package/src/core/socket.ts +14 -0
  206. package/src/core/strategies/best_connected_ever_strategy.ts +81 -0
  207. package/src/core/strategies/delayed_strategy.ts +48 -0
  208. package/src/core/strategies/first_connected_strategy.ts +31 -0
  209. package/src/core/strategies/if_strategy.ts +34 -0
  210. package/src/core/strategies/sequential_strategy.ts +129 -0
  211. package/src/core/strategies/strategy.ts +8 -0
  212. package/src/core/strategies/strategy_builder.ts +67 -0
  213. package/src/core/strategies/strategy_options.ts +18 -0
  214. package/src/core/strategies/strategy_runner.ts +6 -0
  215. package/src/core/strategies/transport_strategy.ts +144 -0
  216. package/src/core/strategies/websocket_prioritized_cached_strategy.ts +157 -0
  217. package/src/core/timeline/level.ts +7 -0
  218. package/src/core/timeline/timeline.ts +90 -0
  219. package/src/core/timeline/timeline_sender.ts +33 -0
  220. package/src/core/timeline/timeline_transport.ts +11 -0
  221. package/src/core/transports/assistant_to_the_transport_manager.ts +104 -0
  222. package/src/core/transports/ping_delay_options.ts +7 -0
  223. package/src/core/transports/transport.ts +54 -0
  224. package/src/core/transports/transport_connection.ts +241 -0
  225. package/src/core/transports/transport_connection_options.ts +8 -0
  226. package/src/core/transports/transport_hooks.ts +16 -0
  227. package/src/core/transports/transport_manager.ts +52 -0
  228. package/src/core/transports/transports_table.ts +12 -0
  229. package/src/core/transports/url_scheme.ts +13 -0
  230. package/src/core/transports/url_schemes.ts +47 -0
  231. package/src/core/user.ts +186 -0
  232. package/src/core/util.ts +34 -0
  233. package/src/core/utils/collections.ts +353 -0
  234. package/src/core/utils/factory.ts +79 -0
  235. package/src/core/utils/flat_promise.ts +10 -0
  236. package/src/core/utils/timers/abstract_timer.ts +39 -0
  237. package/src/core/utils/timers/index.ts +39 -0
  238. package/src/core/utils/timers/scheduling.ts +11 -0
  239. package/src/core/utils/timers/timed_callback.ts +5 -0
  240. package/src/core/utils/url_store.ts +48 -0
  241. package/src/core/watchlist.ts +31 -0
  242. package/src/d.ts/constants/index.d.ts +5 -0
  243. package/src/d.ts/faye-websocket/faye-websocket.d.ts +21 -0
  244. package/src/d.ts/global/global.d.ts +1 -0
  245. package/src/d.ts/module/module.d.ts +12 -0
  246. package/src/d.ts/tweetnacl-util/index.d.ts +6 -0
  247. package/src/d.ts/window/events.d.ts +4 -0
  248. package/src/d.ts/window/sockjs.d.ts +3 -0
  249. package/src/d.ts/window/websocket.d.ts +4 -0
  250. package/src/d.ts/window/xmlhttprequest.d.ts +3 -0
  251. package/src/filter.ts +5 -0
  252. package/src/index.ts +8 -0
  253. package/src/runtimes/interface.ts +60 -0
  254. package/src/runtimes/isomorphic/auth/xhr_auth.ts +90 -0
  255. package/src/runtimes/isomorphic/default_strategy.ts +155 -0
  256. package/src/runtimes/isomorphic/http/http.ts +32 -0
  257. package/src/runtimes/isomorphic/http/http_xhr_request.ts +35 -0
  258. package/src/runtimes/isomorphic/runtime.ts +62 -0
  259. package/src/runtimes/isomorphic/timeline/xhr_timeline.ts +50 -0
  260. package/src/runtimes/isomorphic/transports/transport_connection_initializer.ts +19 -0
  261. package/src/runtimes/isomorphic/transports/transports.ts +83 -0
  262. package/src/runtimes/node/net_info.ts +10 -0
  263. package/src/runtimes/node/runtime.ts +68 -0
  264. package/src/runtimes/react-native/net_info.ts +42 -0
  265. package/src/runtimes/react-native/runtime.ts +65 -0
  266. package/src/runtimes/web/auth/jsonp_auth.ts +51 -0
  267. package/src/runtimes/web/browser.ts +24 -0
  268. package/src/runtimes/web/default_strategy.ts +201 -0
  269. package/src/runtimes/web/dom/dependencies.ts +16 -0
  270. package/src/runtimes/web/dom/dependency_loader.ts +93 -0
  271. package/src/runtimes/web/dom/json2.js +486 -0
  272. package/src/runtimes/web/dom/jsonp_request.ts +52 -0
  273. package/src/runtimes/web/dom/script_receiver.ts +8 -0
  274. package/src/runtimes/web/dom/script_receiver_factory.ts +57 -0
  275. package/src/runtimes/web/dom/script_request.ts +85 -0
  276. package/src/runtimes/web/http/http.ts +8 -0
  277. package/src/runtimes/web/http/http_xdomain_request.ts +37 -0
  278. package/src/runtimes/web/net_info.ts +50 -0
  279. package/src/runtimes/web/runtime.ts +174 -0
  280. package/src/runtimes/web/timeline/jsonp_timeline.ts +34 -0
  281. package/src/runtimes/web/transports/transport_connection_initializer.ts +39 -0
  282. package/src/runtimes/web/transports/transports.ts +67 -0
  283. package/src/runtimes/worker/auth/fetch_auth.ts +69 -0
  284. package/src/runtimes/worker/net_info.ts +10 -0
  285. package/src/runtimes/worker/runtime.ts +75 -0
  286. package/src/runtimes/worker/timeline/fetch_timeline.ts +39 -0
  287. package/tsconfig.json +18 -0
  288. package/types/spec/javascripts/helpers/node/mock-dom-dependencies.d.ts +1 -0
  289. package/types/spec/javascripts/helpers/pusher_integration_class.d.ts +4 -0
  290. package/types/src/core/auth/auth_transports.d.ts +9 -0
  291. package/types/src/core/auth/channel_authorizer.d.ts +3 -0
  292. package/types/src/core/auth/deprecated_channel_authorizer.d.ts +18 -0
  293. package/types/src/core/auth/options.d.ts +48 -0
  294. package/types/src/core/auth/user_authenticator.d.ts +3 -0
  295. package/types/src/core/base64.d.ts +1 -0
  296. package/types/src/core/channels/channel.d.ts +25 -0
  297. package/types/src/core/channels/channel_table.d.ts +5 -0
  298. package/types/src/core/channels/channels.d.ts +12 -0
  299. package/types/src/core/channels/encrypted_channel.d.ts +15 -0
  300. package/types/src/core/channels/filter.d.ts +33 -0
  301. package/types/src/core/channels/members.d.ts +14 -0
  302. package/types/src/core/channels/metadata.d.ts +4 -0
  303. package/types/src/core/channels/presence_channel.d.ts +13 -0
  304. package/types/src/core/channels/private_channel.d.ts +5 -0
  305. package/types/src/core/config.d.ts +31 -0
  306. package/types/src/core/connection/callbacks.d.ts +18 -0
  307. package/types/src/core/connection/connection.d.ts +16 -0
  308. package/types/src/core/connection/connection_manager.d.ts +50 -0
  309. package/types/src/core/connection/connection_manager_options.d.ts +11 -0
  310. package/types/src/core/connection/handshake/handshake_payload.d.ts +8 -0
  311. package/types/src/core/connection/handshake/index.d.ts +12 -0
  312. package/types/src/core/connection/protocol/action.d.ts +7 -0
  313. package/types/src/core/connection/protocol/message-types.d.ts +10 -0
  314. package/types/src/core/connection/protocol/protocol.d.ts +10 -0
  315. package/types/src/core/defaults.d.ts +26 -0
  316. package/types/src/core/delta/channel_state.d.ts +23 -0
  317. package/types/src/core/delta/decoders.d.ts +12 -0
  318. package/types/src/core/delta/index.d.ts +4 -0
  319. package/types/src/core/delta/manager.d.ts +27 -0
  320. package/types/src/core/delta/types.d.ts +50 -0
  321. package/types/src/core/errors.d.ts +28 -0
  322. package/types/src/core/events/callback.d.ts +5 -0
  323. package/types/src/core/events/callback_registry.d.ts +11 -0
  324. package/types/src/core/events/callback_table.d.ts +5 -0
  325. package/types/src/core/events/dispatcher.d.ts +14 -0
  326. package/types/src/core/http/ajax.d.ts +16 -0
  327. package/types/src/core/http/http_factory.d.ts +13 -0
  328. package/types/src/core/http/http_polling_socket.d.ts +3 -0
  329. package/types/src/core/http/http_request.d.ts +17 -0
  330. package/types/src/core/http/http_socket.d.ts +32 -0
  331. package/types/src/core/http/http_streaming_socket.d.ts +3 -0
  332. package/types/src/core/http/request_hooks.d.ts +6 -0
  333. package/types/src/core/http/socket_hooks.d.ts +8 -0
  334. package/types/src/core/http/state.d.ts +6 -0
  335. package/types/src/core/http/url_location.d.ts +5 -0
  336. package/types/src/core/logger.d.ts +11 -0
  337. package/types/src/core/options.d.ts +36 -0
  338. package/types/src/core/pusher-with-encryption.d.ts +5 -0
  339. package/types/src/core/pusher.d.ts +56 -0
  340. package/types/src/core/reachability.d.ts +5 -0
  341. package/types/src/core/socket.d.ts +12 -0
  342. package/types/src/core/strategies/best_connected_ever_strategy.d.ts +10 -0
  343. package/types/src/core/strategies/delayed_strategy.d.ts +15 -0
  344. package/types/src/core/strategies/first_connected_strategy.d.ts +8 -0
  345. package/types/src/core/strategies/if_strategy.d.ts +10 -0
  346. package/types/src/core/strategies/sequential_strategy.d.ts +16 -0
  347. package/types/src/core/strategies/strategy.d.ts +6 -0
  348. package/types/src/core/strategies/strategy_builder.d.ts +5 -0
  349. package/types/src/core/strategies/strategy_options.d.ts +16 -0
  350. package/types/src/core/strategies/strategy_runner.d.ts +5 -0
  351. package/types/src/core/strategies/transport_strategy.d.ts +15 -0
  352. package/types/src/core/strategies/websocket_prioritized_cached_strategy.d.ts +20 -0
  353. package/types/src/core/timeline/level.d.ts +6 -0
  354. package/types/src/core/timeline/timeline.d.ts +25 -0
  355. package/types/src/core/timeline/timeline_sender.d.ts +13 -0
  356. package/types/src/core/timeline/timeline_transport.d.ts +6 -0
  357. package/types/src/core/transports/assistant_to_the_transport_manager.d.ts +14 -0
  358. package/types/src/core/transports/ping_delay_options.d.ts +6 -0
  359. package/types/src/core/transports/transport.d.ts +8 -0
  360. package/types/src/core/transports/transport_connection.d.ts +35 -0
  361. package/types/src/core/transports/transport_connection_options.d.ts +6 -0
  362. package/types/src/core/transports/transport_hooks.d.ts +13 -0
  363. package/types/src/core/transports/transport_manager.d.ts +14 -0
  364. package/types/src/core/transports/transports_table.d.ts +10 -0
  365. package/types/src/core/transports/url_scheme.d.ts +11 -0
  366. package/types/src/core/transports/url_schemes.d.ts +4 -0
  367. package/types/src/core/user.d.ts +21 -0
  368. package/types/src/core/util.d.ts +8 -0
  369. package/types/src/core/utils/collections.d.ts +18 -0
  370. package/types/src/core/utils/factory.d.ts +29 -0
  371. package/types/src/core/utils/flat_promise.d.ts +6 -0
  372. package/types/src/core/utils/timers/abstract_timer.d.ts +10 -0
  373. package/types/src/core/utils/timers/index.d.ts +9 -0
  374. package/types/src/core/utils/timers/scheduling.d.ts +8 -0
  375. package/types/src/core/utils/timers/timed_callback.d.ts +4 -0
  376. package/types/src/core/utils/url_store.d.ts +4 -0
  377. package/types/src/core/watchlist.d.ts +8 -0
  378. package/types/src/runtimes/interface.d.ts +43 -0
  379. package/types/src/runtimes/isomorphic/auth/xhr_auth.d.ts +3 -0
  380. package/types/src/runtimes/isomorphic/default_strategy.d.ts +5 -0
  381. package/types/src/runtimes/isomorphic/http/http.d.ts +3 -0
  382. package/types/src/runtimes/isomorphic/http/http_xhr_request.d.ts +3 -0
  383. package/types/src/runtimes/isomorphic/runtime.d.ts +2 -0
  384. package/types/src/runtimes/isomorphic/timeline/xhr_timeline.d.ts +6 -0
  385. package/types/src/runtimes/isomorphic/transports/transport_connection_initializer.d.ts +1 -0
  386. package/types/src/runtimes/isomorphic/transports/transports.d.ts +5 -0
  387. package/types/src/runtimes/node/net_info.d.ts +6 -0
  388. package/types/src/runtimes/node/runtime.d.ts +3 -0
  389. package/types/src/runtimes/react-native/net_info.d.ts +8 -0
  390. package/types/src/runtimes/react-native/runtime.d.ts +3 -0
  391. package/types/src/runtimes/web/auth/jsonp_auth.d.ts +3 -0
  392. package/types/src/runtimes/web/browser.d.ts +19 -0
  393. package/types/src/runtimes/web/default_strategy.d.ts +5 -0
  394. package/types/src/runtimes/web/dom/dependencies.d.ts +4 -0
  395. package/types/src/runtimes/web/dom/dependency_loader.d.ts +10 -0
  396. package/types/src/runtimes/web/dom/jsonp_request.d.ts +10 -0
  397. package/types/src/runtimes/web/dom/script_receiver.d.ts +7 -0
  398. package/types/src/runtimes/web/dom/script_receiver_factory.d.ts +10 -0
  399. package/types/src/runtimes/web/dom/script_request.d.ts +9 -0
  400. package/types/src/runtimes/web/http/http.d.ts +2 -0
  401. package/types/src/runtimes/web/http/http_xdomain_request.d.ts +3 -0
  402. package/types/src/runtimes/web/net_info.d.ts +7 -0
  403. package/types/src/runtimes/web/runtime.d.ts +3 -0
  404. package/types/src/runtimes/web/timeline/jsonp_timeline.d.ts +6 -0
  405. package/types/src/runtimes/web/transports/transport_connection_initializer.d.ts +1 -0
  406. package/types/src/runtimes/web/transports/transports.d.ts +2 -0
  407. package/types/src/runtimes/worker/auth/fetch_auth.d.ts +3 -0
  408. package/types/src/runtimes/worker/net_info.d.ts +6 -0
  409. package/types/src/runtimes/worker/runtime.d.ts +3 -0
  410. package/types/src/runtimes/worker/timeline/fetch_timeline.d.ts +6 -0
  411. package/vite.config.js +52 -0
  412. package/vite.config.node.js +72 -0
  413. package/webpack/config.node.js +26 -0
  414. package/webpack/config.react-native.js +35 -0
  415. package/webpack/config.shared.js +50 -0
  416. package/webpack/config.web.js +36 -0
  417. package/webpack/config.worker.js +42 -0
  418. package/webpack/dev.server.js +17 -0
  419. package/webpack/hosting_config.js +6 -0
  420. package/with-encryption/index.d.ts +29 -0
  421. package/with-encryption/index.js +4 -0
  422. package/worker/index.d.ts +29 -0
  423. package/worker/index.js +1 -0
  424. package/worker/with-encryption/index.d.ts +29 -0
  425. package/worker/with-encryption/index.js +1 -0
@@ -0,0 +1,638 @@
1
+ # Import Guide for Pusher-JS (Sockudo Edition)
2
+
3
+ This guide explains how to import and use the Pusher-JS library with delta compression and tag filtering features.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Basic Import (Pusher Only)](#basic-import-pusher-only)
8
+ - [With Filter Support](#with-filter-support)
9
+ - [Framework Examples](#framework-examples)
10
+ - [Vue 3](#vue-3)
11
+ - [React](#react)
12
+ - [Angular](#angular)
13
+ - [Vanilla JavaScript](#vanilla-javascript)
14
+ - [TypeScript Support](#typescript-support)
15
+ - [Delta Compression](#delta-compression)
16
+ - [Tag Filtering](#tag-filtering)
17
+
18
+ ---
19
+
20
+ ## Basic Import (Pusher Only)
21
+
22
+ When you only need the Pusher client without filters:
23
+
24
+ ```javascript
25
+ import Pusher from 'pusher-js';
26
+
27
+ const pusher = new Pusher('your-app-key', {
28
+ cluster: 'mt1',
29
+ wsHost: 'localhost',
30
+ wsPort: 6001,
31
+ forceTLS: false,
32
+ });
33
+
34
+ const channel = pusher.subscribe('my-channel');
35
+ channel.bind('my-event', (data) => {
36
+ console.log('Received:', data);
37
+ });
38
+ ```
39
+
40
+ ---
41
+
42
+ ## With Filter Support
43
+
44
+ When you need tag filtering capabilities, import Filter separately:
45
+
46
+ ```javascript
47
+ import Pusher from 'pusher-js';
48
+ import { Filter, FilterExamples } from 'pusher-js/filter';
49
+
50
+ const pusher = new Pusher('your-app-key', {
51
+ cluster: 'mt1',
52
+ wsHost: 'localhost',
53
+ wsPort: 6001,
54
+ });
55
+
56
+ // Subscribe with a filter
57
+ const channel = pusher.subscribe(
58
+ 'events-channel',
59
+ Filter.eq('event_type', 'goal')
60
+ );
61
+ ```
62
+
63
+ ---
64
+
65
+ ## Framework Examples
66
+
67
+ ### Vue 3
68
+
69
+ #### Composition API
70
+
71
+ ```vue
72
+ <script setup>
73
+ import { ref, onMounted, onUnmounted } from 'vue';
74
+ import Pusher from 'pusher-js';
75
+ import { Filter } from 'pusher-js/filter';
76
+
77
+ const messages = ref([]);
78
+ let pusher = null;
79
+ let channel = null;
80
+
81
+ onMounted(() => {
82
+ // Initialize Pusher
83
+ pusher = new Pusher('your-app-key', {
84
+ cluster: 'mt1',
85
+ wsHost: 'localhost',
86
+ wsPort: 6001,
87
+ forceTLS: false,
88
+
89
+ // Enable delta compression
90
+ deltaCompression: {
91
+ enabled: true,
92
+ algorithms: ['fossil', 'xdelta3'],
93
+ debug: false,
94
+ onStats: (stats) => {
95
+ console.log('Bandwidth saved:', stats.bandwidthSavedPercent + '%');
96
+ }
97
+ }
98
+ });
99
+
100
+ // Subscribe to a channel
101
+ channel = pusher.subscribe('chat-room');
102
+
103
+ channel.bind('message', (data) => {
104
+ messages.value.push(data);
105
+ });
106
+
107
+ // Subscribe with tag filter
108
+ const filteredChannel = pusher.subscribe(
109
+ 'sports-events',
110
+ Filter.or(
111
+ Filter.eq('event_type', 'goal'),
112
+ Filter.eq('event_type', 'red_card')
113
+ )
114
+ );
115
+
116
+ filteredChannel.bind('event', (data) => {
117
+ console.log('Important event:', data);
118
+ });
119
+ });
120
+
121
+ onUnmounted(() => {
122
+ if (channel) {
123
+ channel.unbind_all();
124
+ pusher.unsubscribe(channel.name);
125
+ }
126
+ if (pusher) {
127
+ pusher.disconnect();
128
+ }
129
+ });
130
+ </script>
131
+
132
+ <template>
133
+ <div>
134
+ <h1>Chat Messages</h1>
135
+ <div v-for="msg in messages" :key="msg.id">
136
+ {{ msg.text }}
137
+ </div>
138
+ </div>
139
+ </template>
140
+ ```
141
+
142
+ #### Options API
143
+
144
+ ```vue
145
+ <script>
146
+ import Pusher from 'pusher-js';
147
+ import { Filter } from 'pusher-js/filter';
148
+
149
+ export default {
150
+ data() {
151
+ return {
152
+ pusher: null,
153
+ channel: null,
154
+ messages: []
155
+ };
156
+ },
157
+
158
+ mounted() {
159
+ this.pusher = new Pusher('your-app-key', {
160
+ cluster: 'mt1',
161
+ wsHost: 'localhost',
162
+ wsPort: 6001,
163
+ forceTLS: false,
164
+ });
165
+
166
+ this.channel = this.pusher.subscribe('my-channel');
167
+ this.channel.bind('message', this.handleMessage);
168
+ },
169
+
170
+ methods: {
171
+ handleMessage(data) {
172
+ this.messages.push(data);
173
+ }
174
+ },
175
+
176
+ beforeUnmount() {
177
+ if (this.channel) {
178
+ this.channel.unbind_all();
179
+ this.pusher.unsubscribe(this.channel.name);
180
+ }
181
+ if (this.pusher) {
182
+ this.pusher.disconnect();
183
+ }
184
+ }
185
+ };
186
+ </script>
187
+ ```
188
+
189
+ ### React
190
+
191
+ ```jsx
192
+ import { useEffect, useState } from 'react';
193
+ import Pusher from 'pusher-js';
194
+ import { Filter } from 'pusher-js/filter';
195
+
196
+ function ChatComponent() {
197
+ const [messages, setMessages] = useState([]);
198
+ const [pusher, setPusher] = useState(null);
199
+
200
+ useEffect(() => {
201
+ // Initialize Pusher
202
+ const pusherInstance = new Pusher('your-app-key', {
203
+ cluster: 'mt1',
204
+ wsHost: 'localhost',
205
+ wsPort: 6001,
206
+ forceTLS: false,
207
+
208
+ // Enable delta compression
209
+ deltaCompression: {
210
+ enabled: true,
211
+ algorithms: ['fossil', 'xdelta3']
212
+ }
213
+ });
214
+
215
+ setPusher(pusherInstance);
216
+
217
+ // Subscribe to channel
218
+ const channel = pusherInstance.subscribe('chat-room');
219
+
220
+ channel.bind('message', (data) => {
221
+ setMessages(prev => [...prev, data]);
222
+ });
223
+
224
+ // Subscribe with filter
225
+ const filteredChannel = pusherInstance.subscribe(
226
+ 'notifications',
227
+ Filter.eq('priority', 'high')
228
+ );
229
+
230
+ filteredChannel.bind('notification', (data) => {
231
+ console.log('High priority notification:', data);
232
+ });
233
+
234
+ // Cleanup
235
+ return () => {
236
+ channel.unbind_all();
237
+ filteredChannel.unbind_all();
238
+ pusherInstance.unsubscribe('chat-room');
239
+ pusherInstance.unsubscribe('notifications');
240
+ pusherInstance.disconnect();
241
+ };
242
+ }, []);
243
+
244
+ return (
245
+ <div>
246
+ <h1>Chat Messages</h1>
247
+ {messages.map((msg, idx) => (
248
+ <div key={idx}>{msg.text}</div>
249
+ ))}
250
+ </div>
251
+ );
252
+ }
253
+
254
+ export default ChatComponent;
255
+ ```
256
+
257
+ ### Angular
258
+
259
+ ```typescript
260
+ import { Component, OnInit, OnDestroy } from '@angular/core';
261
+ import Pusher from 'pusher-js';
262
+ import { Filter } from 'pusher-js/filter';
263
+
264
+ @Component({
265
+ selector: 'app-chat',
266
+ templateUrl: './chat.component.html'
267
+ })
268
+ export class ChatComponent implements OnInit, OnDestroy {
269
+ messages: any[] = [];
270
+ private pusher: any;
271
+ private channel: any;
272
+
273
+ ngOnInit() {
274
+ this.pusher = new Pusher('your-app-key', {
275
+ cluster: 'mt1',
276
+ wsHost: 'localhost',
277
+ wsPort: 6001,
278
+ forceTLS: false,
279
+
280
+ deltaCompression: {
281
+ enabled: true,
282
+ algorithms: ['fossil', 'xdelta3']
283
+ }
284
+ });
285
+
286
+ this.channel = this.pusher.subscribe('chat-room');
287
+
288
+ this.channel.bind('message', (data: any) => {
289
+ this.messages.push(data);
290
+ });
291
+
292
+ // Subscribe with filter
293
+ const filteredChannel = this.pusher.subscribe(
294
+ 'events',
295
+ Filter.in('type', ['goal', 'assist'])
296
+ );
297
+
298
+ filteredChannel.bind('event', (data: any) => {
299
+ console.log('Sports event:', data);
300
+ });
301
+ }
302
+
303
+ ngOnDestroy() {
304
+ if (this.channel) {
305
+ this.channel.unbind_all();
306
+ this.pusher.unsubscribe(this.channel.name);
307
+ }
308
+ if (this.pusher) {
309
+ this.pusher.disconnect();
310
+ }
311
+ }
312
+ }
313
+ ```
314
+
315
+ ### Vanilla JavaScript
316
+
317
+ ```html
318
+ <!DOCTYPE html>
319
+ <html>
320
+ <head>
321
+ <title>Pusher Example</title>
322
+ </head>
323
+ <body>
324
+ <div id="messages"></div>
325
+
326
+ <script type="module">
327
+ import Pusher from './node_modules/pusher-js/dist/web/pusher.mjs';
328
+ import { Filter } from './node_modules/pusher-js/dist/web/filter.mjs';
329
+
330
+ const pusher = new Pusher('your-app-key', {
331
+ cluster: 'mt1',
332
+ wsHost: 'localhost',
333
+ wsPort: 6001,
334
+ forceTLS: false,
335
+ });
336
+
337
+ const channel = pusher.subscribe('my-channel');
338
+
339
+ channel.bind('message', (data) => {
340
+ const div = document.createElement('div');
341
+ div.textContent = data.text;
342
+ document.getElementById('messages').appendChild(div);
343
+ });
344
+
345
+ // With filter
346
+ const filteredChannel = pusher.subscribe(
347
+ 'notifications',
348
+ Filter.eq('urgent', 'true')
349
+ );
350
+
351
+ filteredChannel.bind('alert', (data) => {
352
+ alert('Urgent: ' + data.message);
353
+ });
354
+ </script>
355
+ </body>
356
+ </html>
357
+ ```
358
+
359
+ ---
360
+
361
+ ## TypeScript Support
362
+
363
+ Full TypeScript definitions are included:
364
+
365
+ ```typescript
366
+ import Pusher from 'pusher-js';
367
+ import { Filter, FilterNode, FilterExamples } from 'pusher-js/filter';
368
+ import type { Channel, PresenceChannel } from 'pusher-js';
369
+
370
+ // Type-safe Pusher initialization
371
+ const pusher = new Pusher('your-app-key', {
372
+ cluster: 'mt1',
373
+ wsHost: 'localhost',
374
+ wsPort: 6001,
375
+ forceTLS: false,
376
+ });
377
+
378
+ // Type-safe channel
379
+ const channel: Channel = pusher.subscribe('my-channel');
380
+
381
+ // Type-safe filter
382
+ const filter: FilterNode = Filter.and(
383
+ Filter.eq('type', 'order'),
384
+ Filter.gte('amount', '100')
385
+ );
386
+
387
+ const filteredChannel = pusher.subscribe('orders', filter);
388
+ ```
389
+
390
+ ---
391
+
392
+ ## Delta Compression
393
+
394
+ Enable delta compression to save up to 60-90% bandwidth on similar consecutive messages:
395
+
396
+ ```javascript
397
+ import Pusher from 'pusher-js';
398
+
399
+ const pusher = new Pusher('your-app-key', {
400
+ cluster: 'mt1',
401
+ wsHost: 'localhost',
402
+ wsPort: 6001,
403
+
404
+ // Delta compression configuration
405
+ deltaCompression: {
406
+ enabled: true,
407
+ algorithms: ['fossil', 'xdelta3'], // Supported algorithms
408
+ debug: true, // Enable debug logging
409
+ onStats: (stats) => {
410
+ console.log('Delta Compression Stats:', {
411
+ totalMessages: stats.totalMessages,
412
+ deltaMessages: stats.deltaMessages,
413
+ fullMessages: stats.fullMessages,
414
+ bandwidthSaved: stats.bandwidthSavedPercent.toFixed(1) + '%'
415
+ });
416
+ },
417
+ onError: (error) => {
418
+ console.error('Delta compression error:', error);
419
+ }
420
+ }
421
+ });
422
+
423
+ // Get delta statistics
424
+ const stats = pusher.getDeltaStats();
425
+ console.log('Bandwidth saved:', stats.bandwidthSavedPercent);
426
+
427
+ // Reset statistics
428
+ pusher.resetDeltaStats();
429
+ ```
430
+
431
+ ### Delta Compression Notes
432
+
433
+ - **Automatic**: Once enabled, delta compression works transparently
434
+ - **Server-side**: Must be enabled on the server (Sockudo) as well
435
+ - **Algorithms**: Supports `fossil` (fast) and `xdelta3` (better compression)
436
+ - **Fallback**: Automatically falls back to full messages if decoding fails
437
+
438
+ ---
439
+
440
+ ## Tag Filtering
441
+
442
+ Subscribe to channels with server-side filtering to reduce bandwidth:
443
+
444
+ ```javascript
445
+ import Pusher from 'pusher-js';
446
+ import { Filter, FilterExamples } from 'pusher-js/filter';
447
+
448
+ const pusher = new Pusher('your-app-key', {
449
+ cluster: 'mt1',
450
+ wsHost: 'localhost',
451
+ wsPort: 6001,
452
+ });
453
+
454
+ // Simple equality filter
455
+ const goalsChannel = pusher.subscribe(
456
+ 'match:123',
457
+ Filter.eq('event_type', 'goal')
458
+ );
459
+
460
+ // Complex filter with AND/OR
461
+ const importantEvents = pusher.subscribe(
462
+ 'match:123',
463
+ Filter.or(
464
+ Filter.eq('event_type', 'goal'),
465
+ Filter.and(
466
+ Filter.eq('event_type', 'shot'),
467
+ Filter.gte('xG', '0.8') // High expected goals
468
+ )
469
+ )
470
+ );
471
+
472
+ // Range filter
473
+ const highValueOrders = pusher.subscribe(
474
+ 'orders',
475
+ Filter.and(
476
+ Filter.gte('amount', '100'),
477
+ Filter.lte('amount', '1000')
478
+ )
479
+ );
480
+
481
+ // IN filter (multiple values)
482
+ const selectedTypes = pusher.subscribe(
483
+ 'events',
484
+ Filter.in('type', ['goal', 'assist', 'penalty'])
485
+ );
486
+
487
+ // String filters
488
+ const userEvents = pusher.subscribe(
489
+ 'activity',
490
+ Filter.startsWith('user_id', 'premium_')
491
+ );
492
+
493
+ // Existence filter
494
+ const hasLocation = pusher.subscribe(
495
+ 'updates',
496
+ Filter.exists('location')
497
+ );
498
+ ```
499
+
500
+ ### Available Filter Operators
501
+
502
+ ```javascript
503
+ // Comparison
504
+ Filter.eq(key, value) // Equal
505
+ Filter.neq(key, value) // Not equal
506
+ Filter.gt(key, value) // Greater than
507
+ Filter.gte(key, value) // Greater than or equal
508
+ Filter.lt(key, value) // Less than
509
+ Filter.lte(key, value) // Less than or equal
510
+
511
+ // Set operations
512
+ Filter.in(key, values) // In array
513
+ Filter.nin(key, values) // Not in array
514
+
515
+ // String operations
516
+ Filter.startsWith(key, value) // Starts with
517
+ Filter.endsWith(key, value) // Ends with
518
+ Filter.contains(key, value) // Contains substring
519
+
520
+ // Existence
521
+ Filter.exists(key) // Key exists
522
+ Filter.notExists(key) // Key does not exist
523
+
524
+ // Logical operators
525
+ Filter.and(...filters) // All filters must match
526
+ Filter.or(...filters) // Any filter must match
527
+ Filter.not(filter) // Negate filter
528
+ ```
529
+
530
+ ### Filter Examples
531
+
532
+ ```javascript
533
+ import { FilterExamples } from 'pusher-js/filter';
534
+
535
+ // Pre-built filter examples
536
+ const goalEvents = FilterExamples.eventType('goal');
537
+ const multipleTypes = FilterExamples.eventTypes(['goal', 'shot', 'save']);
538
+ const rangeFilter = FilterExamples.range('price', '10', '100');
539
+ const importantEvents = FilterExamples.importantEvents('0.7'); // xG threshold
540
+ ```
541
+
542
+ ### Server-Side Requirements
543
+
544
+ For tag filtering to work:
545
+
546
+ 1. **Server must support it**: Ensure Sockudo has tag filtering enabled
547
+ 2. **Tags in publications**: Server must include tags when publishing events:
548
+
549
+ ```javascript
550
+ // Server-side (Node.js example)
551
+ pusher.trigger('match:123', 'event', {
552
+ player: 'Messi',
553
+ minute: 34
554
+ }, {
555
+ tags: {
556
+ event_type: 'goal',
557
+ priority: 'high'
558
+ }
559
+ });
560
+ ```
561
+
562
+ ---
563
+
564
+ ## Migration from Previous Versions
565
+
566
+ If you were using the old import style:
567
+
568
+ ### ❌ Old Way (No Longer Works)
569
+ ```javascript
570
+ import Pusher, { Filter } from 'pusher-js';
571
+ ```
572
+
573
+ ### ✅ New Way (Clean Separation)
574
+ ```javascript
575
+ import Pusher from 'pusher-js';
576
+ import { Filter } from 'pusher-js/filter';
577
+ ```
578
+
579
+ ### Why the Change?
580
+
581
+ This change provides:
582
+ - **Better bundling**: Works consistently across all bundlers (Webpack, Vite, Bun, Rollup)
583
+ - **Smaller bundles**: Only import Filter if you need it
584
+ - **Clearer API**: Separate concerns (connection vs. filtering)
585
+ - **TypeScript friendly**: Better type inference and IDE support
586
+
587
+ ---
588
+
589
+ ## Troubleshooting
590
+
591
+ ### Module Not Found: 'pusher-js/filter'
592
+
593
+ Make sure your bundler supports package.json `exports` field. Most modern bundlers do:
594
+ - ✅ Webpack 5+
595
+ - ✅ Vite
596
+ - ✅ Bun
597
+ - ✅ Rollup with `@rollup/plugin-node-resolve`
598
+ - ⚠️ Webpack 4: May need configuration updates
599
+
600
+ ### Delta Compression Not Working
601
+
602
+ 1. Check server has delta compression enabled
603
+ 2. Ensure delta libraries are loaded (fossil-delta, vcdiff-decoder)
604
+ 3. Check browser console for errors
605
+ 4. Try enabling debug mode: `deltaCompression: { debug: true }`
606
+
607
+ ### Tag Filtering Not Working
608
+
609
+ 1. Verify server has tag filtering enabled
610
+ 2. Check that server includes tags when publishing events
611
+ 3. Use `validateFilter` to check filter syntax:
612
+
613
+ ```javascript
614
+ import { validateFilter } from 'pusher-js/filter';
615
+
616
+ const filter = Filter.eq('type', 'goal');
617
+ const error = validateFilter(filter);
618
+ if (error) {
619
+ console.error('Invalid filter:', error);
620
+ }
621
+ ```
622
+
623
+ ---
624
+
625
+ ## Additional Resources
626
+
627
+ - [Delta Compression Documentation](./DELTA_COMPRESSION.md)
628
+ - [Tag Filtering Documentation](./TAG_FILTERING_CLIENT.md)
629
+ - [Main README](./README.md)
630
+ - [Sockudo Server Documentation](../../README.md)
631
+
632
+ ---
633
+
634
+ ## Support
635
+
636
+ For issues, questions, or contributions:
637
+ - GitHub Issues: [Sockudo Issues](https://github.com/Cendars/sockudo-cendars/issues)
638
+ - Pusher-JS Issues: [Pusher-JS Issues](https://github.com/Cendars/sockudo-js/issues)