@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,412 @@
1
+ import AbstractRuntime from '../runtimes/interface';
2
+ import Runtime from 'runtime';
3
+ import Util from './util';
4
+ import * as Collections from './utils/collections';
5
+ import Channels from './channels/channels';
6
+ import Channel from './channels/channel';
7
+ import { default as EventsDispatcher } from './events/dispatcher';
8
+ import Timeline from './timeline/timeline';
9
+ import TimelineSender from './timeline/timeline_sender';
10
+ import TimelineLevel from './timeline/level';
11
+ import { defineTransport } from './strategies/strategy_builder';
12
+ import ConnectionManager from './connection/connection_manager';
13
+ import ConnectionManagerOptions from './connection/connection_manager_options';
14
+ import { PeriodicTimer } from './utils/timers';
15
+ import Defaults from './defaults';
16
+ import * as DefaultConfig from './config';
17
+ import Logger, { setLoggerConfig } from './logger';
18
+ import Factory from './utils/factory';
19
+ import UrlStore from 'core/utils/url_store';
20
+ import { Options, validateOptions } from './options';
21
+ import { Config, getConfig } from './config';
22
+ import StrategyOptions from './strategies/strategy_options';
23
+ import UserFacade from './user';
24
+ import DeltaCompressionManager from './delta/manager';
25
+ import { DeltaStats } from './delta/types';
26
+ import { Filter, validateFilter, FilterExamples } from './channels/filter';
27
+ import type { FilterNode } from './channels/filter';
28
+
29
+ // Re-export filter types and utilities for easy access
30
+ export { Filter, validateFilter, FilterExamples };
31
+ export type { FilterNode };
32
+
33
+ export default class Pusher {
34
+ /* STATIC PROPERTIES */
35
+ static instances: Pusher[] = [];
36
+ static isReady: boolean = false;
37
+
38
+ private static _logToConsole: boolean = false;
39
+ private static _log: ((message: any) => void) | undefined;
40
+
41
+ static get logToConsole(): boolean {
42
+ return this._logToConsole;
43
+ }
44
+
45
+ static set logToConsole(value: boolean) {
46
+ this._logToConsole = value;
47
+ setLoggerConfig({ logToConsole: value, log: this._log });
48
+ }
49
+
50
+ static get log(): ((message: any) => void) | undefined {
51
+ return this._log;
52
+ }
53
+
54
+ static set log(fn: ((message: any) => void) | undefined) {
55
+ this._log = fn;
56
+ setLoggerConfig({ logToConsole: this._logToConsole, log: fn });
57
+ }
58
+
59
+ // for jsonp
60
+ static Runtime: AbstractRuntime = Runtime;
61
+ static ScriptReceivers: any = (<any>Runtime).ScriptReceivers;
62
+ static DependenciesReceivers: any = (<any>Runtime).DependenciesReceivers;
63
+ static auth_callbacks: any = (<any>Runtime).auth_callbacks;
64
+
65
+ static ready() {
66
+ Pusher.isReady = true;
67
+ for (var i = 0, l = Pusher.instances.length; i < l; i++) {
68
+ Pusher.instances[i].connect();
69
+ }
70
+ }
71
+
72
+ private static getClientFeatures(): string[] {
73
+ return Collections.keys(
74
+ Collections.filterObject({ ws: Runtime.Transports.ws }, function (t) {
75
+ return t.isSupported({});
76
+ }),
77
+ );
78
+ }
79
+
80
+ /* INSTANCE PROPERTIES */
81
+ key: string;
82
+ config: Config;
83
+ channels: Channels;
84
+ global_emitter: EventsDispatcher;
85
+ sessionID: number;
86
+ timeline: Timeline;
87
+ timelineSender: TimelineSender;
88
+ connection: ConnectionManager;
89
+ timelineSenderTimer: PeriodicTimer;
90
+ user: UserFacade;
91
+ deltaCompression: DeltaCompressionManager;
92
+ constructor(app_key: string, options: Options) {
93
+ checkAppKey(app_key);
94
+ validateOptions(options);
95
+ this.key = app_key;
96
+ this.config = getConfig(options, this);
97
+
98
+ this.channels = Factory.createChannels();
99
+ this.global_emitter = new EventsDispatcher();
100
+ this.sessionID = Runtime.randomInt(1000000000);
101
+
102
+ this.timeline = new Timeline(this.key, this.sessionID, {
103
+ cluster: this.config.cluster,
104
+ features: Pusher.getClientFeatures(),
105
+ params: this.config.timelineParams || {},
106
+ limit: 50,
107
+ level: TimelineLevel.INFO,
108
+ version: Defaults.VERSION,
109
+ });
110
+ if (this.config.enableStats) {
111
+ this.timelineSender = Factory.createTimelineSender(this.timeline, {
112
+ host: this.config.statsHost,
113
+ path: '/timeline/v2/' + Runtime.TimelineTransport.name,
114
+ });
115
+ }
116
+
117
+ var getStrategy = (options: StrategyOptions) => {
118
+ return Runtime.getDefaultStrategy(this.config, options, defineTransport);
119
+ };
120
+
121
+ this.connection = Factory.createConnectionManager(this.key, {
122
+ getStrategy: getStrategy,
123
+ timeline: this.timeline,
124
+ activityTimeout: this.config.activityTimeout,
125
+ pongTimeout: this.config.pongTimeout,
126
+ unavailableTimeout: this.config.unavailableTimeout,
127
+ useTLS: Boolean(this.config.useTLS),
128
+ });
129
+
130
+ // Initialize delta compression manager if configured
131
+ // Note: We always create the manager if deltaCompression option is present,
132
+ // but only enable it automatically if enabled: true
133
+ if (options.deltaCompression !== undefined) {
134
+ this.deltaCompression = new DeltaCompressionManager(
135
+ options.deltaCompression || {},
136
+ (event: string, data: any) => this.send_event(event, data),
137
+ );
138
+ }
139
+
140
+ this.connection.bind('connected', () => {
141
+ this.subscribeAll();
142
+ if (this.timelineSender) {
143
+ this.timelineSender.send(this.connection.isUsingTLS());
144
+ }
145
+ // Enable delta compression after connection only if explicitly enabled
146
+ if (this.deltaCompression && options.deltaCompression?.enabled === true) {
147
+ this.deltaCompression.enable();
148
+ }
149
+ });
150
+
151
+ this.connection.bind('message', (event) => {
152
+ var eventName = event.event;
153
+ var internal = eventName.indexOf('pusher_internal:') === 0;
154
+
155
+ // Handle delta compression protocol events
156
+ if (this.deltaCompression) {
157
+ if (eventName === 'pusher:delta_compression_enabled') {
158
+ this.deltaCompression.handleEnabled(event.data);
159
+ // Don't return - let it emit to global listeners
160
+ } else if (eventName === 'pusher:delta_cache_sync' && event.channel) {
161
+ this.deltaCompression.handleCacheSync(event.channel, event.data);
162
+ return;
163
+ } else if (eventName === 'pusher:delta' && event.channel) {
164
+ // Check if channel still exists before processing delta
165
+ // This prevents errors from in-flight delta messages after unsubscribe
166
+ var channel = this.channel(event.channel);
167
+ if (!channel) {
168
+ // Channel was unsubscribed, silently ignore delta message
169
+ return;
170
+ }
171
+
172
+ // Decode delta and emit reconstructed event
173
+ const reconstructedEvent = this.deltaCompression.handleDeltaMessage(
174
+ event.channel,
175
+ event.data,
176
+ );
177
+ if (reconstructedEvent) {
178
+ // Route to channel
179
+ if (channel) {
180
+ channel.handleEvent(reconstructedEvent);
181
+ }
182
+ // Emit globally
183
+ this.global_emitter.emit(
184
+ reconstructedEvent.event,
185
+ reconstructedEvent.data,
186
+ );
187
+ }
188
+ return;
189
+ }
190
+ }
191
+
192
+ if (event.channel) {
193
+ var channel = this.channel(event.channel);
194
+ if (channel) {
195
+ channel.handleEvent(event);
196
+ }
197
+
198
+ // Store full messages for delta compression
199
+ if (
200
+ this.deltaCompression &&
201
+ event.event &&
202
+ !event.event.startsWith('pusher:') &&
203
+ !event.event.startsWith('pusher_internal:')
204
+ ) {
205
+ // Extract sequence number from message level (not from data)
206
+ let sequence: number | undefined;
207
+ if (typeof (event as any).sequence === 'number') {
208
+ sequence = (event as any).sequence;
209
+ }
210
+
211
+ // Extract conflation_key before we delete it
212
+ let conflationKey: string | undefined;
213
+ if (typeof (event as any).conflation_key === 'string') {
214
+ conflationKey = (event as any).conflation_key;
215
+ }
216
+
217
+ // Use RAW message and strip metadata fields using REGEX
218
+ // This preserves exact byte representation (including float precision)
219
+ // We MUST NOT use JSON.parse/stringify as it can change float representations
220
+ let fullMessage = event.rawMessage || '';
221
+
222
+ if (fullMessage && sequence !== undefined) {
223
+ // Strip metadata fields using regex to preserve exact bytes
224
+ // Pattern matches: ,"__delta_seq":NUMBER or "__delta_seq":NUMBER, at start
225
+ fullMessage = fullMessage.replace(/,"__delta_seq":\d+/g, '');
226
+ fullMessage = fullMessage.replace(/"__delta_seq":\d+,/g, '');
227
+ // Pattern matches: ,"__conflation_key":"..." or "__conflation_key":"...", at start
228
+ fullMessage = fullMessage.replace(
229
+ /,"__conflation_key":"[^"]*"/g,
230
+ '',
231
+ );
232
+ fullMessage = fullMessage.replace(
233
+ /"__conflation_key":"[^"]*",/g,
234
+ '',
235
+ );
236
+ }
237
+
238
+ this.deltaCompression.handleFullMessage(
239
+ event.channel,
240
+ fullMessage,
241
+ sequence,
242
+ conflationKey,
243
+ );
244
+ }
245
+ }
246
+ // Emit globally [deprecated]
247
+ if (!internal) {
248
+ this.global_emitter.emit(event.event, event.data);
249
+ }
250
+ });
251
+ this.connection.bind('connecting', () => {
252
+ this.channels.disconnect();
253
+ });
254
+ this.connection.bind('disconnected', () => {
255
+ this.channels.disconnect();
256
+ });
257
+ this.connection.bind('error', (err) => {
258
+ Logger.warn(err);
259
+ });
260
+
261
+ Pusher.instances.push(this);
262
+ this.timeline.info({ instances: Pusher.instances.length });
263
+
264
+ this.user = new UserFacade(this);
265
+
266
+ if (Pusher.isReady) {
267
+ this.connect();
268
+ }
269
+ }
270
+
271
+ channel(name: string): Channel {
272
+ return this.channels.find(name);
273
+ }
274
+
275
+ allChannels(): Channel[] {
276
+ return this.channels.all();
277
+ }
278
+
279
+ connect() {
280
+ this.connection.connect();
281
+
282
+ if (this.timelineSender) {
283
+ if (!this.timelineSenderTimer) {
284
+ var usingTLS = this.connection.isUsingTLS();
285
+ var timelineSender = this.timelineSender;
286
+ this.timelineSenderTimer = new PeriodicTimer(60000, function () {
287
+ timelineSender.send(usingTLS);
288
+ });
289
+ }
290
+ }
291
+ }
292
+
293
+ disconnect() {
294
+ this.connection.disconnect();
295
+
296
+ if (this.timelineSenderTimer) {
297
+ this.timelineSenderTimer.ensureAborted();
298
+ this.timelineSenderTimer = null;
299
+ }
300
+ }
301
+
302
+ bind(event_name: string, callback: Function, context?: any): Pusher {
303
+ this.global_emitter.bind(event_name, callback, context);
304
+ return this;
305
+ }
306
+
307
+ unbind(event_name?: string, callback?: Function, context?: any): Pusher {
308
+ this.global_emitter.unbind(event_name, callback, context);
309
+ return this;
310
+ }
311
+
312
+ bind_global(callback: Function): Pusher {
313
+ this.global_emitter.bind_global(callback);
314
+ return this;
315
+ }
316
+
317
+ unbind_global(callback?: Function): Pusher {
318
+ this.global_emitter.unbind_global(callback);
319
+ return this;
320
+ }
321
+
322
+ unbind_all(callback?: Function): Pusher {
323
+ this.global_emitter.unbind_all();
324
+ return this;
325
+ }
326
+
327
+ subscribeAll() {
328
+ var channelName;
329
+ for (channelName in this.channels.channels) {
330
+ if (this.channels.channels.hasOwnProperty(channelName)) {
331
+ this.subscribe(channelName);
332
+ }
333
+ }
334
+ }
335
+
336
+ subscribe(channel_name: string, tagsFilter?: any) {
337
+ var channel = this.channels.add(channel_name, this);
338
+
339
+ // Set tags filter if provided
340
+ if (tagsFilter) {
341
+ channel.tagsFilter = tagsFilter;
342
+ }
343
+
344
+ if (channel.subscriptionPending && channel.subscriptionCancelled) {
345
+ channel.reinstateSubscription();
346
+ } else if (
347
+ !channel.subscriptionPending &&
348
+ this.connection.state === 'connected'
349
+ ) {
350
+ channel.subscribe();
351
+ }
352
+ return channel;
353
+ }
354
+
355
+ unsubscribe(channel_name: string) {
356
+ var channel = this.channels.find(channel_name);
357
+ if (channel && channel.subscriptionPending) {
358
+ channel.cancelSubscription();
359
+ } else {
360
+ channel = this.channels.remove(channel_name);
361
+ if (channel && channel.subscribed) {
362
+ channel.unsubscribe();
363
+ }
364
+ }
365
+
366
+ // Clear delta compression state for this channel to prevent stale base messages
367
+ // on resubscribe. The server also clears its state, so both sides start fresh.
368
+ if (this.deltaCompression) {
369
+ this.deltaCompression.clearChannelState(channel_name);
370
+ }
371
+ }
372
+
373
+ send_event(event_name: string, data: any, channel?: string) {
374
+ return this.connection.send_event(event_name, data, channel);
375
+ }
376
+
377
+ shouldUseTLS(): boolean {
378
+ return this.config.useTLS;
379
+ }
380
+
381
+ signin() {
382
+ this.user.signin();
383
+ }
384
+
385
+ /**
386
+ * Get delta compression statistics
387
+ * @returns {DeltaStats} Statistics about delta compression bandwidth savings
388
+ */
389
+ getDeltaStats(): DeltaStats | null {
390
+ if (!this.deltaCompression) {
391
+ return null;
392
+ }
393
+ return this.deltaCompression.getStats();
394
+ }
395
+
396
+ /**
397
+ * Reset delta compression statistics
398
+ */
399
+ resetDeltaStats(): void {
400
+ if (this.deltaCompression) {
401
+ this.deltaCompression.resetStats();
402
+ }
403
+ }
404
+ }
405
+
406
+ function checkAppKey(key) {
407
+ if (key === null || key === undefined) {
408
+ throw 'You must pass your app key when you instantiate Pusher.';
409
+ }
410
+ }
411
+
412
+ Runtime.setup(Pusher);
@@ -0,0 +1,7 @@
1
+ import { default as EventsDispatcher } from './events/dispatcher';
2
+
3
+ interface Reachability extends EventsDispatcher {
4
+ isOnline(): boolean;
5
+ }
6
+
7
+ export default Reachability;
@@ -0,0 +1,14 @@
1
+ interface Socket {
2
+ send(payload: any): void;
3
+ ping?(): void;
4
+ close(code?: any, reason?: any);
5
+ sendRaw?(payload: any): boolean;
6
+
7
+ onopen?(evt?: any): void;
8
+ onerror?(error: any): void;
9
+ onclose?(closeEvent: any): void;
10
+ onmessage?(message: any): void;
11
+ onactivity?(): void;
12
+ }
13
+
14
+ export default Socket;
@@ -0,0 +1,81 @@
1
+ import * as Collections from '../utils/collections';
2
+ import Util from '../util';
3
+ import Strategy from './strategy';
4
+
5
+ /** Launches all substrategies and emits prioritized connected transports.
6
+ *
7
+ * @param {Array} strategies
8
+ */
9
+ export default class BestConnectedEverStrategy implements Strategy {
10
+ strategies: Strategy[];
11
+
12
+ constructor(strategies: Strategy[]) {
13
+ this.strategies = strategies;
14
+ }
15
+
16
+ isSupported(): boolean {
17
+ return Collections.any(this.strategies, Util.method('isSupported'));
18
+ }
19
+
20
+ connect(minPriority: number, callback: Function) {
21
+ return connect(this.strategies, minPriority, function (i, runners) {
22
+ return function (error, handshake) {
23
+ runners[i].error = error;
24
+ if (error) {
25
+ if (allRunnersFailed(runners)) {
26
+ callback(true);
27
+ }
28
+ return;
29
+ }
30
+ Collections.apply(runners, function (runner) {
31
+ runner.forceMinPriority(handshake.transport.priority);
32
+ });
33
+ callback(null, handshake);
34
+ };
35
+ });
36
+ }
37
+ }
38
+
39
+ /** Connects to all strategies in parallel.
40
+ *
41
+ * Callback builder should be a function that takes two arguments: index
42
+ * and a list of runners. It should return another function that will be
43
+ * passed to the substrategy with given index. Runners can be aborted using
44
+ * abortRunner(s) functions from this class.
45
+ *
46
+ * @param {Array} strategies
47
+ * @param {Function} callbackBuilder
48
+ * @return {Object} strategy runner
49
+ */
50
+ function connect(
51
+ strategies: Strategy[],
52
+ minPriority: number,
53
+ callbackBuilder: Function,
54
+ ) {
55
+ var runners = Collections.map(strategies, function (strategy, i, _, rs) {
56
+ return strategy.connect(minPriority, callbackBuilder(i, rs));
57
+ });
58
+ return {
59
+ abort: function () {
60
+ Collections.apply(runners, abortRunner);
61
+ },
62
+ forceMinPriority: function (p) {
63
+ Collections.apply(runners, function (runner) {
64
+ runner.forceMinPriority(p);
65
+ });
66
+ },
67
+ };
68
+ }
69
+
70
+ function allRunnersFailed(runners): boolean {
71
+ return Collections.all(runners, function (runner) {
72
+ return Boolean(runner.error);
73
+ });
74
+ }
75
+
76
+ function abortRunner(runner) {
77
+ if (!runner.error && !runner.aborted) {
78
+ runner.abort();
79
+ runner.aborted = true;
80
+ }
81
+ }
@@ -0,0 +1,48 @@
1
+ import { OneOffTimer as Timer } from '../utils/timers';
2
+ import Strategy from './strategy';
3
+ import StrategyOptions from './strategy_options';
4
+
5
+ /** Runs substrategy after specified delay.
6
+ *
7
+ * Options:
8
+ * - delay - time in miliseconds to delay the substrategy attempt
9
+ *
10
+ * @param {Strategy} strategy
11
+ * @param {Object} options
12
+ */
13
+ export default class DelayedStrategy implements Strategy {
14
+ strategy: Strategy;
15
+ options: { delay: number };
16
+
17
+ constructor(strategy: Strategy, { delay: number }) {
18
+ this.strategy = strategy;
19
+ this.options = { delay: number };
20
+ }
21
+
22
+ isSupported(): boolean {
23
+ return this.strategy.isSupported();
24
+ }
25
+
26
+ connect(minPriority: number, callback: Function) {
27
+ var strategy = this.strategy;
28
+ var runner;
29
+ var timer = new Timer(this.options.delay, function () {
30
+ runner = strategy.connect(minPriority, callback);
31
+ });
32
+
33
+ return {
34
+ abort: function () {
35
+ timer.ensureAborted();
36
+ if (runner) {
37
+ runner.abort();
38
+ }
39
+ },
40
+ forceMinPriority: function (p) {
41
+ minPriority = p;
42
+ if (runner) {
43
+ runner.forceMinPriority(p);
44
+ }
45
+ },
46
+ };
47
+ }
48
+ }
@@ -0,0 +1,31 @@
1
+ import Strategy from './strategy';
2
+ import StrategyRunner from './strategy_runner';
3
+
4
+ /** Launches the substrategy and terminates on the first open connection.
5
+ *
6
+ * @param {Strategy} strategy
7
+ */
8
+ export default class FirstConnectedStrategy implements Strategy {
9
+ strategy: Strategy;
10
+
11
+ constructor(strategy: Strategy) {
12
+ this.strategy = strategy;
13
+ }
14
+
15
+ isSupported(): boolean {
16
+ return this.strategy.isSupported();
17
+ }
18
+
19
+ connect(minPriority: number, callback: Function): StrategyRunner {
20
+ var runner = this.strategy.connect(
21
+ minPriority,
22
+ function (error, handshake) {
23
+ if (handshake) {
24
+ runner.abort();
25
+ }
26
+ callback(error, handshake);
27
+ },
28
+ );
29
+ return runner;
30
+ }
31
+ }
@@ -0,0 +1,34 @@
1
+ import Strategy from './strategy';
2
+ import StrategyRunner from './strategy_runner';
3
+
4
+ /** Proxies method calls to one of substrategies basing on the test function.
5
+ *
6
+ * @param {Function} test
7
+ * @param {Strategy} trueBranch strategy used when test returns true
8
+ * @param {Strategy} falseBranch strategy used when test returns false
9
+ */
10
+ export default class IfStrategy implements Strategy {
11
+ test: () => boolean;
12
+ trueBranch: Strategy;
13
+ falseBranch: Strategy;
14
+
15
+ constructor(
16
+ test: () => boolean,
17
+ trueBranch: Strategy,
18
+ falseBranch: Strategy,
19
+ ) {
20
+ this.test = test;
21
+ this.trueBranch = trueBranch;
22
+ this.falseBranch = falseBranch;
23
+ }
24
+
25
+ isSupported(): boolean {
26
+ var branch = this.test() ? this.trueBranch : this.falseBranch;
27
+ return branch.isSupported();
28
+ }
29
+
30
+ connect(minPriority: number, callback: Function): StrategyRunner {
31
+ var branch = this.test() ? this.trueBranch : this.falseBranch;
32
+ return branch.connect(minPriority, callback);
33
+ }
34
+ }