@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,365 @@
1
+ # Delta Compression in Pusher-JS
2
+
3
+ This document describes the native delta compression and conflation key support in pusher-js for use with Sockudo servers.
4
+
5
+ ## Overview
6
+
7
+ Delta compression reduces bandwidth usage by sending only the differences (deltas) between consecutive messages instead of full messages. This is particularly effective for:
8
+
9
+ - Real-time price updates
10
+ - Market data feeds
11
+ - IoT sensor data
12
+ - Any high-frequency updates with similar structure
13
+
14
+ ### Conflation Keys
15
+
16
+ Conflation keys group messages by a specific field (e.g., `asset`, `device_id`) so that deltas are computed between messages with the same key value. This dramatically improves compression efficiency.
17
+
18
+ **Without conflation keys:**
19
+ ```
20
+ BTC update → ETH update → BTC update → ETH update
21
+ ↓ ↓ ↓
22
+ (comparing unrelated messages = poor compression)
23
+ ```
24
+
25
+ **With conflation keys (asset):**
26
+ ```
27
+ BTC updates: BTC₁ → BTC₂ → BTC₃ (71% compression)
28
+ ETH updates: ETH₁ → ETH₂ → ETH₃ (57% compression)
29
+ ```
30
+
31
+ ## Features
32
+
33
+ - ✅ **Multiple algorithms**: Fossil Delta and Xdelta3 (VCDIFF)
34
+ - ✅ **Conflation keys**: Per-entity message caching for optimal compression
35
+ - ✅ **Automatic cache sync**: Server sends cached messages on subscription
36
+ - ✅ **Bandwidth statistics**: Track compression ratios and savings
37
+ - ✅ **Error recovery**: Automatic resync on decode failures
38
+
39
+ ## Installation
40
+
41
+ ### Required Libraries
42
+
43
+ Include the delta algorithm libraries before pusher-js:
44
+
45
+ ```html
46
+ <!-- Fossil Delta (recommended) -->
47
+ <script src="https://cdn.jsdelivr.net/npm/fossil-delta@1.0.2/fossil-delta.min.js"></script>
48
+
49
+ <!-- OR Xdelta3 (VCDIFF) -->
50
+ <script src="https://cdn.ably.io/lib/vcdiff-decoder.min-1.js"></script>
51
+
52
+ <!-- Pusher JS -->
53
+ <script src="path/to/pusher.min.js"></script>
54
+ ```
55
+
56
+ ### NPM
57
+
58
+ ```bash
59
+ npm install fossil-delta
60
+ # or
61
+ npm install @ably/vcdiff-decoder
62
+ ```
63
+
64
+ ## Usage
65
+
66
+ ### Basic Setup
67
+
68
+ ```javascript
69
+ const pusher = new Pusher('your-app-key', {
70
+ cluster: 'mt1',
71
+ wsHost: 'your-sockudo-server.com',
72
+ wsPort: 6001,
73
+ forceTLS: false,
74
+
75
+ // Enable delta compression
76
+ deltaCompression: {
77
+ enabled: true,
78
+ algorithms: ['fossil', 'xdelta3'], // Preferred algorithms
79
+ debug: true, // Enable debug logging
80
+
81
+ // Optional: Track bandwidth savings
82
+ onStats: (stats) => {
83
+ console.log(`Bandwidth saved: ${stats.bandwidthSavedPercent.toFixed(1)}%`);
84
+ console.log(`Delta messages: ${stats.deltaMessages}`);
85
+ console.log(`Full messages: ${stats.fullMessages}`);
86
+ },
87
+
88
+ // Optional: Handle errors
89
+ onError: (error) => {
90
+ console.error('Delta compression error:', error);
91
+ }
92
+ }
93
+ });
94
+
95
+ // Subscribe to a channel
96
+ const channel = pusher.subscribe('market-data');
97
+
98
+ // Bind to events - delta decompression is automatic
99
+ channel.bind('price-update', (data) => {
100
+ console.log('Price update:', data);
101
+ // Data is automatically reconstructed from deltas
102
+ });
103
+ ```
104
+
105
+ ### Get Statistics
106
+
107
+ ```javascript
108
+ // Get current delta compression stats
109
+ const stats = pusher.getDeltaStats();
110
+
111
+ if (stats) {
112
+ console.log('Total messages:', stats.totalMessages);
113
+ console.log('Delta messages:', stats.deltaMessages);
114
+ console.log('Bandwidth saved:', stats.bandwidthSavedPercent.toFixed(1) + '%');
115
+ console.log('Channels using delta:', stats.channelCount);
116
+
117
+ // Per-channel statistics
118
+ stats.channels.forEach(channelStats => {
119
+ console.log(`Channel ${channelStats.channelName}:`, {
120
+ conflationKey: channelStats.conflationKey,
121
+ deltaCount: channelStats.deltaCount,
122
+ totalMessages: channelStats.totalMessages
123
+ });
124
+ });
125
+ }
126
+
127
+ // Reset statistics
128
+ pusher.resetDeltaStats();
129
+ ```
130
+
131
+ ## Server Configuration
132
+
133
+ ### Enable Delta Compression (Sockudo)
134
+
135
+ On the server side, configure delta compression with conflation keys:
136
+
137
+ ```javascript
138
+ // Sockudo server configuration
139
+ const server = new Sockudo({
140
+ deltaCompression: {
141
+ enabled: true,
142
+ algorithm: 'fossil', // or 'xdelta3'
143
+
144
+ // Channel-specific configuration
145
+ channels: {
146
+ 'market-data': {
147
+ conflationKey: 'asset', // Group by 'asset' field
148
+ maxMessagesPerKey: 100 // Keep last 100 messages per asset
149
+ }
150
+ }
151
+ }
152
+ });
153
+ ```
154
+
155
+ ### Message Format
156
+
157
+ When delta compression is enabled, full messages include metadata:
158
+
159
+ ```javascript
160
+ {
161
+ "asset": "BTC",
162
+ "price": "50000.00",
163
+ "volume": 1234.56,
164
+ "__delta_seq": 42, // Sequence number
165
+ "__conflation_key": "BTC" // Conflation key value
166
+ }
167
+ ```
168
+
169
+ Delta messages look like:
170
+
171
+ ```javascript
172
+ {
173
+ "event": "pusher:delta",
174
+ "channel": "market-data",
175
+ "data": {
176
+ "event": "price-update",
177
+ "delta": "base64-encoded-delta",
178
+ "seq": 43,
179
+ "algorithm": "fossil",
180
+ "conflation_key": "BTC",
181
+ "base_index": 0
182
+ }
183
+ }
184
+ ```
185
+
186
+ ## Protocol Events
187
+
188
+ The following Pusher protocol events are handled automatically:
189
+
190
+ ### `pusher:enable_delta_compression`
191
+
192
+ Sent by the client to enable delta compression:
193
+
194
+ ```javascript
195
+ {
196
+ "event": "pusher:enable_delta_compression",
197
+ "data": {
198
+ "algorithms": ["fossil", "xdelta3"]
199
+ }
200
+ }
201
+ ```
202
+
203
+ ### `pusher:delta_compression_enabled`
204
+
205
+ Server confirms delta compression is enabled:
206
+
207
+ ```javascript
208
+ {
209
+ "event": "pusher:delta_compression_enabled",
210
+ "data": {
211
+ "enabled": true,
212
+ "algorithm": "fossil"
213
+ }
214
+ }
215
+ ```
216
+
217
+ ### `pusher:delta_cache_sync`
218
+
219
+ Server sends cached messages on channel subscription:
220
+
221
+ ```javascript
222
+ {
223
+ "event": "pusher:delta_cache_sync",
224
+ "channel": "market-data",
225
+ "data": {
226
+ "conflation_key": "asset",
227
+ "max_messages_per_key": 100,
228
+ "states": {
229
+ "BTC": [
230
+ { "content": "{...}", "seq": 40 },
231
+ { "content": "{...}", "seq": 41 }
232
+ ],
233
+ "ETH": [
234
+ { "content": "{...}", "seq": 38 }
235
+ ]
236
+ }
237
+ }
238
+ }
239
+ ```
240
+
241
+ ### `pusher:delta`
242
+
243
+ Server sends delta-compressed message:
244
+
245
+ ```javascript
246
+ {
247
+ "event": "pusher:delta",
248
+ "channel": "market-data",
249
+ "data": {
250
+ "event": "price-update",
251
+ "delta": "...", // base64 encoded
252
+ "seq": 42,
253
+ "algorithm": "fossil",
254
+ "conflation_key": "BTC",
255
+ "base_index": 0
256
+ }
257
+ }
258
+ ```
259
+
260
+ ### `pusher:delta_sync_error`
261
+
262
+ Client requests resync when decode fails:
263
+
264
+ ```javascript
265
+ {
266
+ "event": "pusher:delta_sync_error",
267
+ "data": {
268
+ "channel": "market-data"
269
+ }
270
+ }
271
+ ```
272
+
273
+ ## Compression Results
274
+
275
+ Based on real-world testing with market data:
276
+
277
+ ### Without Conflation Keys
278
+ - **Compression**: ~32.6% bandwidth savings
279
+ - Messages compared sequentially regardless of content similarity
280
+
281
+ ### With Conflation Keys
282
+ - **Compression**: ~40-71% bandwidth savings per key
283
+ - BTC updates: 71.4% compression (comparing BTC→BTC)
284
+ - ETH updates: 56.8% compression (comparing ETH→ETH)
285
+
286
+ ## TypeScript Support
287
+
288
+ Full TypeScript definitions are included:
289
+
290
+ ```typescript
291
+ import Pusher from 'pusher-js';
292
+ import { DeltaStats, DeltaOptions } from 'pusher-js/types/src/core/delta/types';
293
+
294
+ const pusher = new Pusher('key', {
295
+ deltaCompression: {
296
+ enabled: true,
297
+ algorithms: ['fossil'],
298
+ onStats: (stats: DeltaStats) => {
299
+ console.log(stats.bandwidthSavedPercent);
300
+ }
301
+ }
302
+ });
303
+ ```
304
+
305
+ ## Browser Support
306
+
307
+ - Modern browsers with WebSocket and TextEncoder/TextDecoder support
308
+ - IE11+ (with polyfills)
309
+ - Node.js 12+
310
+
311
+ ## Performance Considerations
312
+
313
+ 1. **Algorithm Choice**:
314
+ - **Fossil Delta**: Faster, smaller library (~2KB)
315
+ - **Xdelta3**: Better compression for larger differences
316
+
317
+ 2. **Conflation Keys**:
318
+ - Choose keys with many repeated updates (e.g., `asset`, `device_id`)
319
+ - Avoid high-cardinality keys (millions of unique values)
320
+
321
+ 3. **Cache Size**:
322
+ - Default: 10 messages per key
323
+ - Increase for better compression (uses more memory)
324
+ - Server and client must match
325
+
326
+ ## Troubleshooting
327
+
328
+ ### Delta decode failures
329
+
330
+ If you see decode errors:
331
+
332
+ 1. Ensure delta libraries are loaded before Pusher
333
+ 2. Check that server and client algorithms match
334
+ 3. Verify cache sync is received before deltas
335
+ 4. Enable debug logging: `deltaCompression: { debug: true }`
336
+
337
+ ### No compression
338
+
339
+ If compression isn't working:
340
+
341
+ 1. Check server has delta compression enabled
342
+ 2. Verify `pusher:delta_compression_enabled` event received
343
+ 3. Ensure messages have `__delta_seq` field
344
+ 4. Check channel is subscribed before messages arrive
345
+
346
+ ### Poor compression ratio
347
+
348
+ If compression is low:
349
+
350
+ 1. Configure conflation keys on server
351
+ 2. Ensure messages have similar structure
352
+ 3. Verify conflation key field exists in messages
353
+ 4. Consider increasing `maxMessagesPerKey`
354
+
355
+ ## Examples
356
+
357
+ See the `interactive/` directory for complete working examples:
358
+
359
+ - `interactive/public/delta-compression.js` - Client-side implementation
360
+ - `interactive/public/conflation-test.js` - Conflation key testing
361
+ - `interactive/public/app.js` - Full dashboard with statistics
362
+
363
+ ## License
364
+
365
+ Same as pusher-js (MIT)
package/DELTA_USAGE.md ADDED
@@ -0,0 +1,179 @@
1
+ # Delta Compression Usage Guide
2
+
3
+ ## Overview
4
+
5
+ The sockudo-js library now includes built-in support for delta compression with fossil-delta and @ably/vcdiff-decoder packages. Delta messages are **automatically decoded** and delivered to your event handlers seamlessly.
6
+
7
+ ## Installation
8
+
9
+ The required packages are already installed as dependencies:
10
+
11
+ ```json
12
+ {
13
+ "dependencies": {
14
+ "@ably/vcdiff-decoder": "^1.0.6",
15
+ "fossil-delta": "^2.0.0"
16
+ }
17
+ }
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ### 1. Enable Delta Compression
23
+
24
+ ```javascript
25
+ const pusher = new Pusher(appKey, {
26
+ wsHost: 'localhost',
27
+ wsPort: 6001,
28
+ forceTLS: false,
29
+ enabledTransports: ['ws'],
30
+ delta: {
31
+ enabled: true,
32
+ algorithms: ['fossil', 'xdelta3'],
33
+ debug: true,
34
+ onStats: (stats) => {
35
+ console.log('Delta stats:', stats);
36
+ }
37
+ }
38
+ });
39
+ ```
40
+
41
+ ### 2. Subscribe and Bind to Events (Seamless API)
42
+
43
+ **The key feature**: You don't need to handle delta messages manually! Just bind to your events normally:
44
+
45
+ ```javascript
46
+ const channel = pusher.subscribe('my-channel');
47
+
48
+ // This receives BOTH full messages AND automatically decoded delta messages
49
+ channel.bind('price-update', (data) => {
50
+ console.log('Received price update:', data);
51
+ // data is already decoded - whether it was a delta or full message,
52
+ // you get the complete, decoded message here!
53
+ });
54
+
55
+ // Works with bind_global too
56
+ channel.bind_global((eventName, data) => {
57
+ console.log(`Event ${eventName}:`, data);
58
+ // All events (including decoded deltas) come through here
59
+ });
60
+ ```
61
+
62
+ ### 3. Automatic Decoding Flow
63
+
64
+ Here's what happens behind the scenes:
65
+
66
+ 1. **Full Message** arrives:
67
+ - Library stores it as base for future deltas
68
+ - Emits to your `bind()` handler normally
69
+
70
+ 2. **Delta Message** arrives:
71
+ - Library automatically decodes it using the stored base
72
+ - Reconstructs the full message
73
+ - Updates the base for next delta
74
+ - Emits the **decoded** message to your `bind()` handler
75
+ - Your handler receives the full, decoded data (no difference from full message!)
76
+
77
+ ### 4. What You Should NOT Do
78
+
79
+ ❌ **Don't manually bind to `pusher:delta`**:
80
+ ```javascript
81
+ // DON'T DO THIS - it's redundant!
82
+ channel.bind('pusher:delta', (data) => {
83
+ // Manual decoding...
84
+ });
85
+ ```
86
+
87
+ The library handles delta decoding internally. Binding to `pusher:delta` will not receive events because the library intercepts and decodes them before routing.
88
+
89
+ ### 5. Monitoring Delta Compression Stats
90
+
91
+ ```javascript
92
+ const pusher = new Pusher(appKey, {
93
+ delta: {
94
+ enabled: true,
95
+ onStats: (stats) => {
96
+ console.log('Total messages:', stats.totalMessages);
97
+ console.log('Delta messages:', stats.deltaMessages);
98
+ console.log('Full messages:', stats.fullMessages);
99
+ console.log('Bandwidth saved:', stats.bandwidthSavedPercent.toFixed(1) + '%');
100
+ }
101
+ }
102
+ });
103
+ ```
104
+
105
+ ### 6. Advanced: Conflation Keys
106
+
107
+ For channels using conflation (multiple entity streams on one channel):
108
+
109
+ ```javascript
110
+ // No changes needed in your code!
111
+ // The library automatically handles conflation keys internally
112
+
113
+ channel.bind('price-update', (data) => {
114
+ // You get the decoded message for the specific entity
115
+ // Library manages separate base messages per conflation key
116
+ });
117
+ ```
118
+
119
+ ## Example: Complete Integration
120
+
121
+ ```javascript
122
+ // Initialize Pusher with delta compression
123
+ const pusher = new Pusher('your-app-key', {
124
+ wsHost: 'localhost',
125
+ wsPort: 6001,
126
+ forceTLS: false,
127
+ enabledTransports: ['ws'],
128
+ delta: {
129
+ enabled: true,
130
+ debug: true,
131
+ onStats: (stats) => {
132
+ document.getElementById('bandwidth-saved').textContent =
133
+ stats.bandwidthSavedPercent.toFixed(1) + '%';
134
+ }
135
+ }
136
+ });
137
+
138
+ // Subscribe to channel
139
+ const channel = pusher.subscribe('stock-prices');
140
+
141
+ // Bind to events - seamlessly receives full AND decoded delta messages
142
+ channel.bind('price-update', (data) => {
143
+ // data is always the complete, decoded message
144
+ updateUI(data.symbol, data.price, data.volume);
145
+ });
146
+
147
+ // Handle subscription success
148
+ channel.bind('pusher:subscription_succeeded', () => {
149
+ console.log('Subscribed successfully');
150
+ });
151
+ ```
152
+
153
+ ## Benefits
154
+
155
+ - ✅ **Seamless API**: No changes needed to handle delta vs full messages
156
+ - ✅ **Automatic decoding**: Library handles all complexity
157
+ - ✅ **Bandwidth savings**: 60-90% reduction for similar consecutive messages
158
+ - ✅ **Transparent**: Your event handlers work the same way with or without delta compression
159
+ - ✅ **Conflation support**: Automatically handles multiple entity streams
160
+ - ✅ **Error recovery**: Automatic resync on decode failures
161
+
162
+ ## Troubleshooting
163
+
164
+ ### Delta messages not decoding
165
+
166
+ 1. Check that fossil-delta and @ably/vcdiff-decoder are installed
167
+ 2. Enable debug mode: `delta: { debug: true }`
168
+ 3. Check browser console for `[DeltaCompression]` logs
169
+ 4. Verify server has delta compression enabled
170
+
171
+ ### High error count
172
+
173
+ Check stats for errors:
174
+ ```javascript
175
+ const stats = pusher.deltaCompression?.getStats();
176
+ console.log('Errors:', stats.errors);
177
+ ```
178
+
179
+ If errors are high, the library will automatically request resync from the server.