@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,504 @@
1
+ /**
2
+ * Delta Compression Manager
3
+ *
4
+ * Handles delta compression for Pusher messages with support for:
5
+ * - Multiple delta algorithms (Fossil, Xdelta3)
6
+ * - Conflation keys for efficient per-entity caching
7
+ * - Bandwidth statistics tracking
8
+ */
9
+
10
+ import Logger from '../logger';
11
+ import { PusherEvent } from '../connection/protocol/message-types';
12
+ import ChannelState from './channel_state';
13
+ import { FossilDeltaDecoder, Xdelta3Decoder, base64ToBytes } from './decoders';
14
+ import {
15
+ DeltaOptions,
16
+ DeltaStats,
17
+ DeltaMessage,
18
+ DeltaAlgorithm,
19
+ CacheSyncData,
20
+ } from './types';
21
+
22
+ export default class DeltaCompressionManager {
23
+ private options: Required<DeltaOptions>;
24
+ private enabled: boolean;
25
+ private channelStates: Map<string, ChannelState>;
26
+ private stats: {
27
+ totalMessages: number;
28
+ deltaMessages: number;
29
+ fullMessages: number;
30
+ totalBytesWithoutCompression: number;
31
+ totalBytesWithCompression: number;
32
+ errors: number;
33
+ };
34
+ private availableAlgorithms: DeltaAlgorithm[];
35
+ private sendEventCallback: (event: string, data: any) => boolean;
36
+
37
+ constructor(
38
+ options: DeltaOptions = {},
39
+ sendEventCallback: (event: string, data: any) => boolean,
40
+ ) {
41
+ this.options = {
42
+ enabled: options.enabled !== false,
43
+ algorithms: options.algorithms || ['fossil', 'xdelta3'],
44
+ debug: options.debug || false,
45
+ onStats: options.onStats || null,
46
+ onError: options.onError || null,
47
+ };
48
+
49
+ this.enabled = false;
50
+ this.channelStates = new Map();
51
+ this.stats = {
52
+ totalMessages: 0,
53
+ deltaMessages: 0,
54
+ fullMessages: 0,
55
+ totalBytesWithoutCompression: 0,
56
+ totalBytesWithCompression: 0,
57
+ errors: 0,
58
+ };
59
+
60
+ this.sendEventCallback = sendEventCallback;
61
+ this.availableAlgorithms = this.detectAvailableAlgorithms();
62
+
63
+ if (this.availableAlgorithms.length === 0) {
64
+ Logger.warn(
65
+ '[DeltaCompression] No delta algorithms available. ' +
66
+ 'Please include fossil-delta or vcdiff-decoder libraries.',
67
+ );
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Detect which algorithm libraries are loaded
73
+ */
74
+ private detectAvailableAlgorithms(): DeltaAlgorithm[] {
75
+ const available: DeltaAlgorithm[] = [];
76
+
77
+ if (FossilDeltaDecoder.isAvailable()) {
78
+ available.push('fossil');
79
+ this.log('Fossil Delta decoder available');
80
+ }
81
+
82
+ if (Xdelta3Decoder.isAvailable()) {
83
+ available.push('xdelta3');
84
+ this.log('Xdelta3 decoder available');
85
+ }
86
+
87
+ return available;
88
+ }
89
+
90
+ /**
91
+ * Enable delta compression
92
+ */
93
+ enable(): void {
94
+ if (this.enabled || !this.options.enabled) {
95
+ return;
96
+ }
97
+
98
+ if (this.availableAlgorithms.length === 0) {
99
+ this.log('No delta algorithms available, cannot enable');
100
+ return;
101
+ }
102
+
103
+ // Filter to only algorithms we support AND want to use
104
+ const supportedAlgorithms = this.availableAlgorithms.filter((algo) =>
105
+ this.options.algorithms.includes(algo),
106
+ );
107
+
108
+ if (supportedAlgorithms.length === 0) {
109
+ this.log('No mutually supported algorithms');
110
+ return;
111
+ }
112
+
113
+ // Send enable request
114
+ this.log('Sending enable request', supportedAlgorithms);
115
+ this.sendEventCallback('pusher:enable_delta_compression', {
116
+ algorithms: supportedAlgorithms,
117
+ });
118
+ }
119
+
120
+ /**
121
+ * Disable delta compression
122
+ * Note: We intentionally do NOT clear channelStates here.
123
+ * This allows state to be preserved across enable/disable cycles,
124
+ * which is important for reconnection scenarios and user toggling.
125
+ * Use clearChannelState() if you need to explicitly clear state.
126
+ */
127
+ disable(): void {
128
+ this.enabled = false;
129
+ }
130
+
131
+ /**
132
+ * Handle delta compression enabled confirmation
133
+ */
134
+ handleEnabled(data: any): void {
135
+ this.enabled = data.enabled || true;
136
+ this.log('Delta compression enabled', data);
137
+ }
138
+
139
+ /**
140
+ * Handle cache sync message (conflation keys)
141
+ */
142
+ handleCacheSync(channel: string, data: CacheSyncData): void {
143
+ this.log('Received cache sync', {
144
+ channel,
145
+ conflationKey: data.conflation_key,
146
+ groupCount: Object.keys(data.states || {}).length,
147
+ });
148
+
149
+ let channelState = this.channelStates.get(channel);
150
+ if (!channelState) {
151
+ channelState = new ChannelState(channel);
152
+ this.channelStates.set(channel, channelState);
153
+ }
154
+
155
+ channelState.initializeFromCacheSync(data);
156
+ this.log('Cache initialized', channelState.getStats());
157
+ }
158
+
159
+ /**
160
+ * Handle delta-compressed message
161
+ */
162
+ handleDeltaMessage(
163
+ channel: string,
164
+ deltaData: DeltaMessage,
165
+ ): PusherEvent | null {
166
+ let deltaBytes: Uint8Array | null = null;
167
+
168
+ try {
169
+ const event = deltaData.event;
170
+ const delta = deltaData.delta;
171
+ const sequence = deltaData.seq;
172
+ const algorithm = deltaData.algorithm || 'fossil';
173
+ const conflationKey = deltaData.conflation_key;
174
+ const baseIndex = deltaData.base_index;
175
+
176
+ this.log('Received delta message', {
177
+ channel,
178
+ event,
179
+ sequence,
180
+ algorithm,
181
+ conflationKey,
182
+ baseIndex,
183
+ deltaSize: delta.length,
184
+ });
185
+
186
+ // Get channel state
187
+ let channelState = this.channelStates.get(channel);
188
+ if (!channelState) {
189
+ // Silently ignore - this is likely an in-flight delta message for an unsubscribed channel
190
+ // No need to log errors or request resync since the channel is gone
191
+ this.log(`Ignoring delta for unsubscribed channel: ${channel}`);
192
+ return null;
193
+ }
194
+
195
+ // Get base message
196
+ let baseMessage: string | null;
197
+ if (channelState.conflationKey) {
198
+ baseMessage = channelState.getBaseMessage(conflationKey, baseIndex);
199
+ if (!baseMessage) {
200
+ this.error(
201
+ `No base message for channel ${channel}, key ${conflationKey}, index ${baseIndex}`,
202
+ );
203
+ if (this.options.debug) {
204
+ this.log('Current conflation cache snapshot', {
205
+ channel,
206
+ conflationKey: channelState.conflationKey,
207
+ cacheSizes: Array.from(
208
+ channelState.conflationCaches.entries(),
209
+ ).map(([key, cache]) => ({ key, size: cache.length })),
210
+ });
211
+ }
212
+ this.requestResync(channel);
213
+ return null;
214
+ }
215
+ } else {
216
+ baseMessage = channelState.baseMessage;
217
+ if (!baseMessage) {
218
+ this.error(`No base message for channel ${channel}`);
219
+ if (this.options.debug) {
220
+ this.log('Channel state missing base', {
221
+ channel,
222
+ lastSequence: channelState.lastSequence,
223
+ });
224
+ }
225
+ this.requestResync(channel);
226
+ return null;
227
+ }
228
+ }
229
+
230
+ // Decode base64 delta
231
+ deltaBytes = base64ToBytes(delta);
232
+
233
+ // Apply delta based on algorithm
234
+ let reconstructedMessage: string;
235
+ try {
236
+ if (algorithm === 'fossil') {
237
+ reconstructedMessage = FossilDeltaDecoder.apply(
238
+ baseMessage,
239
+ deltaBytes,
240
+ );
241
+ } else if (algorithm === 'xdelta3') {
242
+ reconstructedMessage = Xdelta3Decoder.apply(baseMessage, deltaBytes);
243
+ } else {
244
+ throw Error(`Unknown algorithm: ${algorithm}`);
245
+ }
246
+ } catch (decodeError) {
247
+ throw decodeError;
248
+ }
249
+
250
+ // Update conflation cache with reconstructed message
251
+ if (channelState.conflationKey) {
252
+ channelState.updateConflationCache(
253
+ conflationKey,
254
+ reconstructedMessage,
255
+ sequence,
256
+ );
257
+ } else {
258
+ // Update base for non-conflation channels
259
+ channelState.setBase(reconstructedMessage, sequence);
260
+ }
261
+
262
+ // Update state
263
+ channelState.updateSequence(sequence);
264
+ channelState.recordDelta();
265
+
266
+ // Update stats
267
+ this.stats.totalMessages++;
268
+ this.stats.deltaMessages++;
269
+ this.stats.totalBytesWithCompression += deltaBytes.length;
270
+ this.stats.totalBytesWithoutCompression += reconstructedMessage.length;
271
+ this.updateStats();
272
+
273
+ this.log('Delta applied successfully', {
274
+ channel,
275
+ event,
276
+ conflationKey,
277
+ originalSize: reconstructedMessage.length,
278
+ deltaSize: deltaBytes.length,
279
+ compressionRatio:
280
+ ((deltaBytes.length / reconstructedMessage.length) * 100).toFixed(1) +
281
+ '%',
282
+ });
283
+
284
+ // Parse and return the reconstructed event
285
+ try {
286
+ const parsedMessage = JSON.parse(reconstructedMessage);
287
+ return {
288
+ event: event,
289
+ channel: channel,
290
+ data: parsedMessage.data || parsedMessage,
291
+ };
292
+ } catch (e) {
293
+ // If not JSON, return as-is
294
+ return {
295
+ event: event,
296
+ channel: channel,
297
+ data: reconstructedMessage,
298
+ };
299
+ }
300
+ } catch (error) {
301
+ this.error('Delta decode failed', {
302
+ channel,
303
+ event: deltaData.event,
304
+ sequence: deltaData.seq,
305
+ algorithm: deltaData.algorithm,
306
+ conflationKey: deltaData.conflation_key,
307
+ baseIndex: deltaData.base_index,
308
+ deltaSize: deltaData.delta?.length,
309
+ decodedDeltaBytes: deltaBytes ? deltaBytes.length : 'n/a',
310
+ message: (error as Error).message,
311
+ });
312
+ this.stats.errors++;
313
+ return null;
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Handle regular (full) message with delta sequence markers
319
+ */
320
+ handleFullMessage(
321
+ channel: string,
322
+ rawMessage: string,
323
+ sequence?: number,
324
+ conflationKey?: string,
325
+ ): void {
326
+ if (!sequence && sequence !== 0) {
327
+ // Attempt to extract __delta_seq from payload when not provided separately
328
+ try {
329
+ const parsed = JSON.parse(rawMessage);
330
+ const candidate =
331
+ typeof parsed.data === 'string'
332
+ ? (JSON.parse(parsed.data).__delta_seq ?? parsed.__delta_seq)
333
+ : (parsed.data?.__delta_seq ?? parsed.__delta_seq);
334
+ if (candidate === 0 || candidate) {
335
+ sequence = candidate;
336
+ } else {
337
+ this.log('handleFullMessage missing sequence, skipping', {
338
+ channel,
339
+ hasSequence: false,
340
+ });
341
+ return;
342
+ }
343
+ } catch (e) {
344
+ this.log('handleFullMessage missing sequence and parse failed', {
345
+ channel,
346
+ hasSequence: false,
347
+ });
348
+ return;
349
+ }
350
+ }
351
+
352
+ const messageSize = rawMessage.length;
353
+
354
+ let channelState = this.channelStates.get(channel);
355
+ if (!channelState) {
356
+ channelState = new ChannelState(channel);
357
+ this.channelStates.set(channel, channelState);
358
+ }
359
+
360
+ // The rawMessage is already stripped of __delta_seq and __conflation_key by pusher.ts
361
+ // We use it directly as the base - NO re-parsing/re-stringifying to preserve exact bytes
362
+ // (JSON.parse/stringify can change float representations which breaks delta checksums)
363
+
364
+ // Use the provided conflationKey parameter (already extracted by pusher.ts from original message)
365
+ const finalConflationKey = conflationKey;
366
+
367
+ // Initialize conflation if we have a conflation key
368
+ if (finalConflationKey !== undefined && !channelState.conflationKey) {
369
+ channelState.conflationKey = 'enabled';
370
+ }
371
+
372
+ if (channelState.conflationKey && finalConflationKey !== undefined) {
373
+ channelState.updateConflationCache(
374
+ finalConflationKey,
375
+ rawMessage, // Store raw message directly
376
+ sequence,
377
+ );
378
+ this.log('Stored full message (conflation)', {
379
+ channel,
380
+ conflationKey: finalConflationKey,
381
+ sequence,
382
+ size: messageSize,
383
+ });
384
+ } else {
385
+ channelState.setBase(rawMessage, sequence); // Store raw message directly
386
+ this.log('Stored full message', {
387
+ channel,
388
+ sequence,
389
+ size: messageSize,
390
+ });
391
+ }
392
+
393
+ channelState.recordFullMessage();
394
+
395
+ // Update stats
396
+ this.stats.totalMessages++;
397
+ this.stats.fullMessages++;
398
+ this.stats.totalBytesWithoutCompression += messageSize;
399
+ this.stats.totalBytesWithCompression += messageSize;
400
+ this.updateStats();
401
+ }
402
+
403
+ /**
404
+ * Request resync for a channel
405
+ */
406
+ private requestResync(channel: string): void {
407
+ this.log('Requesting resync for channel', channel);
408
+ this.sendEventCallback('pusher:delta_sync_error', { channel });
409
+ this.channelStates.delete(channel);
410
+ }
411
+
412
+ /**
413
+ * Update and emit stats
414
+ */
415
+ private updateStats(): void {
416
+ if (this.options.onStats) {
417
+ this.options.onStats(this.getStats());
418
+ }
419
+ }
420
+
421
+ /**
422
+ * Get current statistics
423
+ */
424
+ getStats(): DeltaStats {
425
+ const bandwidthSaved =
426
+ this.stats.totalBytesWithoutCompression -
427
+ this.stats.totalBytesWithCompression;
428
+ const bandwidthSavedPercent =
429
+ this.stats.totalBytesWithoutCompression > 0
430
+ ? (bandwidthSaved / this.stats.totalBytesWithoutCompression) * 100
431
+ : 0;
432
+
433
+ const channelStats = Array.from(this.channelStates.values()).map((state) =>
434
+ state.getStats(),
435
+ );
436
+
437
+ return {
438
+ ...this.stats,
439
+ bandwidthSaved,
440
+ bandwidthSavedPercent,
441
+ channelCount: this.channelStates.size,
442
+ channels: channelStats,
443
+ };
444
+ }
445
+
446
+ /**
447
+ * Reset statistics
448
+ */
449
+ resetStats(): void {
450
+ this.stats = {
451
+ totalMessages: 0,
452
+ deltaMessages: 0,
453
+ fullMessages: 0,
454
+ totalBytesWithoutCompression: 0,
455
+ totalBytesWithCompression: 0,
456
+ errors: 0,
457
+ };
458
+ this.updateStats();
459
+ }
460
+
461
+ /**
462
+ * Clear channel state
463
+ */
464
+ clearChannelState(channel?: string): void {
465
+ if (channel) {
466
+ this.channelStates.delete(channel);
467
+ } else {
468
+ this.channelStates.clear();
469
+ }
470
+ }
471
+
472
+ /**
473
+ * Check if delta compression is enabled
474
+ */
475
+ isEnabled(): boolean {
476
+ return this.enabled;
477
+ }
478
+
479
+ /**
480
+ * Get available algorithms
481
+ */
482
+ getAvailableAlgorithms(): DeltaAlgorithm[] {
483
+ return this.availableAlgorithms;
484
+ }
485
+
486
+ /**
487
+ * Log message (if debug enabled)
488
+ */
489
+ private log(...args: any[]): void {
490
+ if (this.options.debug) {
491
+ Logger.debug('[DeltaCompression]', ...args);
492
+ }
493
+ }
494
+
495
+ /**
496
+ * Log error
497
+ */
498
+ private error(...args: any[]): void {
499
+ Logger.error('[DeltaCompression]', ...args);
500
+ if (this.options.onError) {
501
+ this.options.onError(args);
502
+ }
503
+ }
504
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Delta Compression Types and Interfaces
3
+ */
4
+
5
+ export type DeltaAlgorithm = 'fossil' | 'xdelta3';
6
+
7
+ export interface DeltaOptions {
8
+ enabled?: boolean;
9
+ algorithms?: DeltaAlgorithm[];
10
+ debug?: boolean;
11
+ onStats?: (stats: DeltaStats) => void;
12
+ onError?: (error: any) => void;
13
+ }
14
+
15
+ export interface DeltaStats {
16
+ totalMessages: number;
17
+ deltaMessages: number;
18
+ fullMessages: number;
19
+ totalBytesWithoutCompression: number;
20
+ totalBytesWithCompression: number;
21
+ bandwidthSaved: number;
22
+ bandwidthSavedPercent: number;
23
+ errors: number;
24
+ channelCount: number;
25
+ channels: ChannelDeltaStats[];
26
+ }
27
+
28
+ export interface ChannelDeltaStats {
29
+ channelName: string;
30
+ conflationKey: string | null;
31
+ conflationGroupCount: number;
32
+ deltaCount: number;
33
+ fullMessageCount: number;
34
+ totalMessages: number;
35
+ }
36
+
37
+ export interface DeltaMessage {
38
+ event: string;
39
+ delta: string; // base64 encoded
40
+ seq: number;
41
+ algorithm?: DeltaAlgorithm;
42
+ conflation_key?: string;
43
+ base_index?: number;
44
+ }
45
+
46
+ export interface CacheSyncData {
47
+ conflation_key?: string;
48
+ max_messages_per_key?: number;
49
+ states?: {
50
+ [key: string]: Array<{
51
+ content: string;
52
+ seq: number;
53
+ }>;
54
+ };
55
+ }
56
+
57
+ export interface CachedMessage {
58
+ content: string;
59
+ sequence: number;
60
+ }
@@ -0,0 +1,69 @@
1
+ /** Error classes used throughout the library. */
2
+ // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
3
+ export class BadEventName extends Error {
4
+ constructor(msg?: string) {
5
+ super(msg);
6
+
7
+ Object.setPrototypeOf(this, new.target.prototype);
8
+ }
9
+ }
10
+
11
+ export class BadChannelName extends Error {
12
+ constructor(msg?: string) {
13
+ super(msg);
14
+
15
+ Object.setPrototypeOf(this, new.target.prototype);
16
+ }
17
+ }
18
+
19
+ export class RequestTimedOut extends Error {
20
+ constructor(msg?: string) {
21
+ super(msg);
22
+
23
+ Object.setPrototypeOf(this, new.target.prototype);
24
+ }
25
+ }
26
+ export class TransportPriorityTooLow extends Error {
27
+ constructor(msg?: string) {
28
+ super(msg);
29
+
30
+ Object.setPrototypeOf(this, new.target.prototype);
31
+ }
32
+ }
33
+ export class TransportClosed extends Error {
34
+ constructor(msg?: string) {
35
+ super(msg);
36
+
37
+ Object.setPrototypeOf(this, new.target.prototype);
38
+ }
39
+ }
40
+ export class UnsupportedFeature extends Error {
41
+ constructor(msg?: string) {
42
+ super(msg);
43
+
44
+ Object.setPrototypeOf(this, new.target.prototype);
45
+ }
46
+ }
47
+ export class UnsupportedTransport extends Error {
48
+ constructor(msg?: string) {
49
+ super(msg);
50
+
51
+ Object.setPrototypeOf(this, new.target.prototype);
52
+ }
53
+ }
54
+ export class UnsupportedStrategy extends Error {
55
+ constructor(msg?: string) {
56
+ super(msg);
57
+
58
+ Object.setPrototypeOf(this, new.target.prototype);
59
+ }
60
+ }
61
+ export class HTTPAuthError extends Error {
62
+ status: number;
63
+ constructor(status: number, msg?: string) {
64
+ super(msg);
65
+ this.status = status;
66
+
67
+ Object.setPrototypeOf(this, new.target.prototype);
68
+ }
69
+ }
@@ -0,0 +1,6 @@
1
+ interface Callback {
2
+ fn: Function;
3
+ context: any;
4
+ }
5
+
6
+ export default Callback;
@@ -0,0 +1,75 @@
1
+ import Callback from './callback';
2
+ import * as Collections from '../utils/collections';
3
+ import CallbackTable from './callback_table';
4
+
5
+ export default class CallbackRegistry {
6
+ _callbacks: CallbackTable;
7
+
8
+ constructor() {
9
+ this._callbacks = {};
10
+ }
11
+
12
+ get(name: string): Callback[] {
13
+ return this._callbacks[prefix(name)];
14
+ }
15
+
16
+ add(name: string, callback: Function, context: any) {
17
+ var prefixedEventName = prefix(name);
18
+ this._callbacks[prefixedEventName] =
19
+ this._callbacks[prefixedEventName] || [];
20
+ this._callbacks[prefixedEventName].push({
21
+ fn: callback,
22
+ context: context,
23
+ });
24
+ }
25
+
26
+ remove(name?: string, callback?: Function, context?: any) {
27
+ if (!name && !callback && !context) {
28
+ this._callbacks = {};
29
+ return;
30
+ }
31
+
32
+ var names = name ? [prefix(name)] : Collections.keys(this._callbacks);
33
+
34
+ if (callback || context) {
35
+ this.removeCallback(names, callback, context);
36
+ } else {
37
+ this.removeAllCallbacks(names);
38
+ }
39
+ }
40
+
41
+ private removeCallback(names: string[], callback: Function, context: any) {
42
+ Collections.apply(
43
+ names,
44
+ function (name) {
45
+ this._callbacks[name] = Collections.filter(
46
+ this._callbacks[name] || [],
47
+ function (binding) {
48
+ return (
49
+ (callback && callback !== binding.fn) ||
50
+ (context && context !== binding.context)
51
+ );
52
+ },
53
+ );
54
+ if (this._callbacks[name].length === 0) {
55
+ delete this._callbacks[name];
56
+ }
57
+ },
58
+ this,
59
+ );
60
+ }
61
+
62
+ private removeAllCallbacks(names: string[]) {
63
+ Collections.apply(
64
+ names,
65
+ function (name) {
66
+ delete this._callbacks[name];
67
+ },
68
+ this,
69
+ );
70
+ }
71
+ }
72
+
73
+ function prefix(name: string): string {
74
+ return '_' + name;
75
+ }