@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.
- package/.editorconfig +14 -0
- package/.github/ISSUE_TEMPLATE.md +11 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/.github/dependabot.yml +14 -0
- package/.github/stale.yml +26 -0
- package/.github/workflows/release.yml +112 -0
- package/.github/workflows/release_pr.yml +43 -0
- package/.github/workflows/run-tests.yml +62 -0
- package/.gitmodules +3 -0
- package/.prettierrc +2 -0
- package/CHANGELOG.md +928 -0
- package/DELTA_COMPRESSION.md +365 -0
- package/DELTA_USAGE.md +179 -0
- package/IMPLEMENTATION_SUMMARY.md +261 -0
- package/IMPORT_GUIDE.md +638 -0
- package/LIBRARY_STRUCTURE_ANALYSIS.md +940 -0
- package/LICENCE +19 -0
- package/Makefile +14 -0
- package/README.md +709 -0
- package/TAG_FILTERING_CLIENT.md +471 -0
- package/bower.json +19 -0
- package/bun.lock +2695 -0
- package/dist/node/filter.js +252 -0
- package/dist/node/filter.js.map +1 -0
- package/dist/node/pusher.js +4434 -0
- package/dist/node/pusher.js.map +1 -0
- package/dist/web/filter.mjs +252 -0
- package/dist/web/filter.mjs.map +1 -0
- package/dist/web/pusher.mjs +5889 -0
- package/dist/web/pusher.mjs.map +1 -0
- package/examples/delta-compression-example.html +372 -0
- package/examples/delta-seamless-example.html +185 -0
- package/index.d.ts +36 -0
- package/integration_tests_server/index.js +176 -0
- package/integration_tests_server/package-lock.json +1177 -0
- package/integration_tests_server/package.json +15 -0
- package/interactive/.env +16 -0
- package/interactive/CONFLATION_TEST.md +73 -0
- package/interactive/DELTA_COMPRESSION_TESTING.md +262 -0
- package/interactive/bun.lock +208 -0
- package/interactive/package-lock.json +1075 -0
- package/interactive/package.json +32 -0
- package/interactive/public/app.js +1363 -0
- package/interactive/public/bundle-entry.js +14 -0
- package/interactive/public/conflation-test.html +508 -0
- package/interactive/public/conflation-test.js +785 -0
- package/interactive/public/delta-compression.js +1090 -0
- package/interactive/public/dist/bundle.js +5857 -0
- package/interactive/public/index.html +392 -0
- package/interactive/public/main.js +20 -0
- package/interactive/public/style.css +823 -0
- package/interactive/server.js +246 -0
- package/interactive/test-bundle.html +89 -0
- package/interactive/test-delta.js +146 -0
- package/node.js +1 -0
- package/package.json +94 -0
- package/pusher-with-encryption/index.js +1 -0
- package/react-native/index.d.ts +29 -0
- package/react-native/index.js +1 -0
- package/spec/config/jasmine/helpers/reporter.js +14 -0
- package/spec/config/jasmine/integration.json +13 -0
- package/spec/config/jasmine/unit.json +13 -0
- package/spec/config/jasmine/webpack.integration.js +33 -0
- package/spec/config/jasmine/webpack.unit.js +30 -0
- package/spec/config/karma/available_browsers.json +4957 -0
- package/spec/config/karma/config.ci.js +25 -0
- package/spec/config/karma/config.common.js +50 -0
- package/spec/config/karma/config.integration.js +26 -0
- package/spec/config/karma/config.unit.js +10 -0
- package/spec/config/karma/config.worker.js +34 -0
- package/spec/config/karma/integration.js +24 -0
- package/spec/config/karma/unit.js +20 -0
- package/spec/javascripts/helpers/mocks.js +274 -0
- package/spec/javascripts/helpers/node/integration.js +33 -0
- package/spec/javascripts/helpers/node/mock-dom-dependencies.ts +1 -0
- package/spec/javascripts/helpers/pusher_integration.js +1 -0
- package/spec/javascripts/helpers/pusher_integration_class.ts +12 -0
- package/spec/javascripts/helpers/timers/promises.js +9 -0
- package/spec/javascripts/helpers/waitsFor.js +37 -0
- package/spec/javascripts/helpers/web/integration.js +44 -0
- package/spec/javascripts/helpers/worker/mock-dom-dependencies.js +1 -0
- package/spec/javascripts/integration/core/cluster_config_spec.js +153 -0
- package/spec/javascripts/integration/core/falling_back_spec.js +195 -0
- package/spec/javascripts/integration/core/pusher_spec/index.js +68 -0
- package/spec/javascripts/integration/core/pusher_spec/test_builder.js +715 -0
- package/spec/javascripts/integration/core/timeout_configuration_spec.js +200 -0
- package/spec/javascripts/integration/core/transport_lists_spec.js +103 -0
- package/spec/javascripts/integration/index.node.js +12 -0
- package/spec/javascripts/integration/index.web.js +63 -0
- package/spec/javascripts/integration/index.worker.js +13 -0
- package/spec/javascripts/integration/web/dom/jsonp_spec.js +97 -0
- package/spec/javascripts/integration/web/dom/script_request_spec.js +90 -0
- package/spec/javascripts/polyfills/index.js +105 -0
- package/spec/javascripts/unit/core/channels/channel_spec.js +355 -0
- package/spec/javascripts/unit/core/channels/channels_spec.js +94 -0
- package/spec/javascripts/unit/core/channels/encrypted_channel_spec.js +343 -0
- package/spec/javascripts/unit/core/channels/presence_channel_spec.js +553 -0
- package/spec/javascripts/unit/core/channels/private_channel_spec.js +182 -0
- package/spec/javascripts/unit/core/config_spec.js +507 -0
- package/spec/javascripts/unit/core/connection/connection_manager_spec.js +656 -0
- package/spec/javascripts/unit/core/connection/connection_spec.js +286 -0
- package/spec/javascripts/unit/core/connection/handshake_spec.js +160 -0
- package/spec/javascripts/unit/core/connection/protocol_spec.js +420 -0
- package/spec/javascripts/unit/core/defaults_spec.js +26 -0
- package/spec/javascripts/unit/core/events_dispatcher_spec.js +385 -0
- package/spec/javascripts/unit/core/http/http_polling_socket_spec.js +60 -0
- package/spec/javascripts/unit/core/http/http_request_spec.js +185 -0
- package/spec/javascripts/unit/core/http/http_socket_spec.js +370 -0
- package/spec/javascripts/unit/core/http/http_streaming_socket_spec.js +56 -0
- package/spec/javascripts/unit/core/http/http_xhr_request_spec.js +164 -0
- package/spec/javascripts/unit/core/logger_spec.js +133 -0
- package/spec/javascripts/unit/core/pusher_spec.js +613 -0
- package/spec/javascripts/unit/core/pusher_with_encryption_spec.js +18 -0
- package/spec/javascripts/unit/core/strategies/best_connected_ever_strategy_spec.js +104 -0
- package/spec/javascripts/unit/core/strategies/delayed_strategy_spec.js +95 -0
- package/spec/javascripts/unit/core/strategies/first_connected_strategy_spec.js +68 -0
- package/spec/javascripts/unit/core/strategies/if_strategy_spec.js +165 -0
- package/spec/javascripts/unit/core/strategies/sequential_strategy_spec.js +213 -0
- package/spec/javascripts/unit/core/strategies/transport_strategy_spec.js +250 -0
- package/spec/javascripts/unit/core/strategies/websocket_prioritized_cached_strategy_spec.js +400 -0
- package/spec/javascripts/unit/core/timeline/timeline_spec.js +153 -0
- package/spec/javascripts/unit/core/transports/assistant_to_the_transport_manager_spec.js +223 -0
- package/spec/javascripts/unit/core/transports/hosts_and_ports_spec.js +85 -0
- package/spec/javascripts/unit/core/transports/transport_connection_spec.js +585 -0
- package/spec/javascripts/unit/core/transports/transport_manager_spec.js +64 -0
- package/spec/javascripts/unit/core/user_spec.js +303 -0
- package/spec/javascripts/unit/core/utils/periodic_timer_spec.js +74 -0
- package/spec/javascripts/unit/core/utils/timers_spec.js +157 -0
- package/spec/javascripts/unit/core/utils/url_store_spec.js +14 -0
- package/spec/javascripts/unit/core/watchlist_spec.js +48 -0
- package/spec/javascripts/unit/core_with_runtime/auth/channel_authorizer_spec.js +137 -0
- package/spec/javascripts/unit/core_with_runtime/auth/deprecated_channel_authorizer_spec.js +48 -0
- package/spec/javascripts/unit/core_with_runtime/auth/user_authorizer_spec.js +128 -0
- package/spec/javascripts/unit/core_with_runtime/readme.md +5 -0
- package/spec/javascripts/unit/index.node.js +11 -0
- package/spec/javascripts/unit/index.web.js +12 -0
- package/spec/javascripts/unit/index.worker.js +11 -0
- package/spec/javascripts/unit/isomorphic/transports/hosts_and_ports_spec.js +82 -0
- package/spec/javascripts/unit/isomorphic/transports/transports_spec.js +202 -0
- package/spec/javascripts/unit/node/timeline_sender_spec.js +83 -0
- package/spec/javascripts/unit/web/dom/dependency_loader_spec.js +249 -0
- package/spec/javascripts/unit/web/dom/jsonp_request_spec.js +130 -0
- package/spec/javascripts/unit/web/dom/script_receiver_factory_spec.js +68 -0
- package/spec/javascripts/unit/web/http/http_xdomain_request_spec.js +222 -0
- package/spec/javascripts/unit/web/pusher_authorizer_spec.js +64 -0
- package/spec/javascripts/unit/web/timeline/timeline_sender_spec.js +131 -0
- package/spec/javascripts/unit/web/transports/hosts_and_ports_spec.js +127 -0
- package/spec/javascripts/unit/web/transports/transports_spec.js +444 -0
- package/spec/javascripts/unit/worker/channel_authorizer_spec.js +156 -0
- package/spec/javascripts/unit/worker/timeline_sender_spec.js +76 -0
- package/src/core/auth/auth_transports.ts +18 -0
- package/src/core/auth/channel_authorizer.ts +64 -0
- package/src/core/auth/deprecated_channel_authorizer.ts +56 -0
- package/src/core/auth/options.ts +76 -0
- package/src/core/auth/user_authenticator.ts +62 -0
- package/src/core/base64.ts +49 -0
- package/src/core/channels/channel.ts +173 -0
- package/src/core/channels/channel_table.ts +7 -0
- package/src/core/channels/channels.ts +86 -0
- package/src/core/channels/encrypted_channel.ts +150 -0
- package/src/core/channels/filter.ts +342 -0
- package/src/core/channels/members.ts +80 -0
- package/src/core/channels/metadata.ts +5 -0
- package/src/core/channels/presence_channel.ts +113 -0
- package/src/core/channels/private_channel.ts +25 -0
- package/src/core/config.ts +189 -0
- package/src/core/connection/callbacks.ts +21 -0
- package/src/core/connection/connection.ts +160 -0
- package/src/core/connection/connection_manager.ts +371 -0
- package/src/core/connection/connection_manager_options.ts +14 -0
- package/src/core/connection/handshake/handshake_payload.ts +10 -0
- package/src/core/connection/handshake/index.ts +90 -0
- package/src/core/connection/protocol/action.ts +8 -0
- package/src/core/connection/protocol/message-types.ts +11 -0
- package/src/core/connection/protocol/protocol.ts +166 -0
- package/src/core/defaults.ts +66 -0
- package/src/core/delta/channel_state.ts +194 -0
- package/src/core/delta/decoders.ts +129 -0
- package/src/core/delta/index.ts +10 -0
- package/src/core/delta/manager.ts +504 -0
- package/src/core/delta/types.ts +60 -0
- package/src/core/errors.ts +69 -0
- package/src/core/events/callback.ts +6 -0
- package/src/core/events/callback_registry.ts +75 -0
- package/src/core/events/callback_table.ts +7 -0
- package/src/core/events/dispatcher.ts +84 -0
- package/src/core/http/ajax.ts +24 -0
- package/src/core/http/http_factory.ts +16 -0
- package/src/core/http/http_polling_socket.ts +24 -0
- package/src/core/http/http_request.ts +81 -0
- package/src/core/http/http_socket.ts +220 -0
- package/src/core/http/http_streaming_socket.ts +19 -0
- package/src/core/http/request_hooks.ts +9 -0
- package/src/core/http/socket_hooks.ts +11 -0
- package/src/core/http/state.ts +7 -0
- package/src/core/http/url_location.ts +6 -0
- package/src/core/logger.ts +66 -0
- package/src/core/options.ts +61 -0
- package/src/core/pusher-licence.js +7 -0
- package/src/core/pusher-with-encryption.js +1 -0
- package/src/core/pusher-with-encryption.ts +14 -0
- package/src/core/pusher.js +10 -0
- package/src/core/pusher.ts +412 -0
- package/src/core/reachability.ts +7 -0
- package/src/core/socket.ts +14 -0
- package/src/core/strategies/best_connected_ever_strategy.ts +81 -0
- package/src/core/strategies/delayed_strategy.ts +48 -0
- package/src/core/strategies/first_connected_strategy.ts +31 -0
- package/src/core/strategies/if_strategy.ts +34 -0
- package/src/core/strategies/sequential_strategy.ts +129 -0
- package/src/core/strategies/strategy.ts +8 -0
- package/src/core/strategies/strategy_builder.ts +67 -0
- package/src/core/strategies/strategy_options.ts +18 -0
- package/src/core/strategies/strategy_runner.ts +6 -0
- package/src/core/strategies/transport_strategy.ts +144 -0
- package/src/core/strategies/websocket_prioritized_cached_strategy.ts +157 -0
- package/src/core/timeline/level.ts +7 -0
- package/src/core/timeline/timeline.ts +90 -0
- package/src/core/timeline/timeline_sender.ts +33 -0
- package/src/core/timeline/timeline_transport.ts +11 -0
- package/src/core/transports/assistant_to_the_transport_manager.ts +104 -0
- package/src/core/transports/ping_delay_options.ts +7 -0
- package/src/core/transports/transport.ts +54 -0
- package/src/core/transports/transport_connection.ts +241 -0
- package/src/core/transports/transport_connection_options.ts +8 -0
- package/src/core/transports/transport_hooks.ts +16 -0
- package/src/core/transports/transport_manager.ts +52 -0
- package/src/core/transports/transports_table.ts +12 -0
- package/src/core/transports/url_scheme.ts +13 -0
- package/src/core/transports/url_schemes.ts +47 -0
- package/src/core/user.ts +186 -0
- package/src/core/util.ts +34 -0
- package/src/core/utils/collections.ts +353 -0
- package/src/core/utils/factory.ts +79 -0
- package/src/core/utils/flat_promise.ts +10 -0
- package/src/core/utils/timers/abstract_timer.ts +39 -0
- package/src/core/utils/timers/index.ts +39 -0
- package/src/core/utils/timers/scheduling.ts +11 -0
- package/src/core/utils/timers/timed_callback.ts +5 -0
- package/src/core/utils/url_store.ts +48 -0
- package/src/core/watchlist.ts +31 -0
- package/src/d.ts/constants/index.d.ts +5 -0
- package/src/d.ts/faye-websocket/faye-websocket.d.ts +21 -0
- package/src/d.ts/global/global.d.ts +1 -0
- package/src/d.ts/module/module.d.ts +12 -0
- package/src/d.ts/tweetnacl-util/index.d.ts +6 -0
- package/src/d.ts/window/events.d.ts +4 -0
- package/src/d.ts/window/sockjs.d.ts +3 -0
- package/src/d.ts/window/websocket.d.ts +4 -0
- package/src/d.ts/window/xmlhttprequest.d.ts +3 -0
- package/src/filter.ts +5 -0
- package/src/index.ts +8 -0
- package/src/runtimes/interface.ts +60 -0
- package/src/runtimes/isomorphic/auth/xhr_auth.ts +90 -0
- package/src/runtimes/isomorphic/default_strategy.ts +155 -0
- package/src/runtimes/isomorphic/http/http.ts +32 -0
- package/src/runtimes/isomorphic/http/http_xhr_request.ts +35 -0
- package/src/runtimes/isomorphic/runtime.ts +62 -0
- package/src/runtimes/isomorphic/timeline/xhr_timeline.ts +50 -0
- package/src/runtimes/isomorphic/transports/transport_connection_initializer.ts +19 -0
- package/src/runtimes/isomorphic/transports/transports.ts +83 -0
- package/src/runtimes/node/net_info.ts +10 -0
- package/src/runtimes/node/runtime.ts +68 -0
- package/src/runtimes/react-native/net_info.ts +42 -0
- package/src/runtimes/react-native/runtime.ts +65 -0
- package/src/runtimes/web/auth/jsonp_auth.ts +51 -0
- package/src/runtimes/web/browser.ts +24 -0
- package/src/runtimes/web/default_strategy.ts +201 -0
- package/src/runtimes/web/dom/dependencies.ts +16 -0
- package/src/runtimes/web/dom/dependency_loader.ts +93 -0
- package/src/runtimes/web/dom/json2.js +486 -0
- package/src/runtimes/web/dom/jsonp_request.ts +52 -0
- package/src/runtimes/web/dom/script_receiver.ts +8 -0
- package/src/runtimes/web/dom/script_receiver_factory.ts +57 -0
- package/src/runtimes/web/dom/script_request.ts +85 -0
- package/src/runtimes/web/http/http.ts +8 -0
- package/src/runtimes/web/http/http_xdomain_request.ts +37 -0
- package/src/runtimes/web/net_info.ts +50 -0
- package/src/runtimes/web/runtime.ts +174 -0
- package/src/runtimes/web/timeline/jsonp_timeline.ts +34 -0
- package/src/runtimes/web/transports/transport_connection_initializer.ts +39 -0
- package/src/runtimes/web/transports/transports.ts +67 -0
- package/src/runtimes/worker/auth/fetch_auth.ts +69 -0
- package/src/runtimes/worker/net_info.ts +10 -0
- package/src/runtimes/worker/runtime.ts +75 -0
- package/src/runtimes/worker/timeline/fetch_timeline.ts +39 -0
- package/tsconfig.json +18 -0
- package/types/spec/javascripts/helpers/node/mock-dom-dependencies.d.ts +1 -0
- package/types/spec/javascripts/helpers/pusher_integration_class.d.ts +4 -0
- package/types/src/core/auth/auth_transports.d.ts +9 -0
- package/types/src/core/auth/channel_authorizer.d.ts +3 -0
- package/types/src/core/auth/deprecated_channel_authorizer.d.ts +18 -0
- package/types/src/core/auth/options.d.ts +48 -0
- package/types/src/core/auth/user_authenticator.d.ts +3 -0
- package/types/src/core/base64.d.ts +1 -0
- package/types/src/core/channels/channel.d.ts +25 -0
- package/types/src/core/channels/channel_table.d.ts +5 -0
- package/types/src/core/channels/channels.d.ts +12 -0
- package/types/src/core/channels/encrypted_channel.d.ts +15 -0
- package/types/src/core/channels/filter.d.ts +33 -0
- package/types/src/core/channels/members.d.ts +14 -0
- package/types/src/core/channels/metadata.d.ts +4 -0
- package/types/src/core/channels/presence_channel.d.ts +13 -0
- package/types/src/core/channels/private_channel.d.ts +5 -0
- package/types/src/core/config.d.ts +31 -0
- package/types/src/core/connection/callbacks.d.ts +18 -0
- package/types/src/core/connection/connection.d.ts +16 -0
- package/types/src/core/connection/connection_manager.d.ts +50 -0
- package/types/src/core/connection/connection_manager_options.d.ts +11 -0
- package/types/src/core/connection/handshake/handshake_payload.d.ts +8 -0
- package/types/src/core/connection/handshake/index.d.ts +12 -0
- package/types/src/core/connection/protocol/action.d.ts +7 -0
- package/types/src/core/connection/protocol/message-types.d.ts +10 -0
- package/types/src/core/connection/protocol/protocol.d.ts +10 -0
- package/types/src/core/defaults.d.ts +26 -0
- package/types/src/core/delta/channel_state.d.ts +23 -0
- package/types/src/core/delta/decoders.d.ts +12 -0
- package/types/src/core/delta/index.d.ts +4 -0
- package/types/src/core/delta/manager.d.ts +27 -0
- package/types/src/core/delta/types.d.ts +50 -0
- package/types/src/core/errors.d.ts +28 -0
- package/types/src/core/events/callback.d.ts +5 -0
- package/types/src/core/events/callback_registry.d.ts +11 -0
- package/types/src/core/events/callback_table.d.ts +5 -0
- package/types/src/core/events/dispatcher.d.ts +14 -0
- package/types/src/core/http/ajax.d.ts +16 -0
- package/types/src/core/http/http_factory.d.ts +13 -0
- package/types/src/core/http/http_polling_socket.d.ts +3 -0
- package/types/src/core/http/http_request.d.ts +17 -0
- package/types/src/core/http/http_socket.d.ts +32 -0
- package/types/src/core/http/http_streaming_socket.d.ts +3 -0
- package/types/src/core/http/request_hooks.d.ts +6 -0
- package/types/src/core/http/socket_hooks.d.ts +8 -0
- package/types/src/core/http/state.d.ts +6 -0
- package/types/src/core/http/url_location.d.ts +5 -0
- package/types/src/core/logger.d.ts +11 -0
- package/types/src/core/options.d.ts +36 -0
- package/types/src/core/pusher-with-encryption.d.ts +5 -0
- package/types/src/core/pusher.d.ts +56 -0
- package/types/src/core/reachability.d.ts +5 -0
- package/types/src/core/socket.d.ts +12 -0
- package/types/src/core/strategies/best_connected_ever_strategy.d.ts +10 -0
- package/types/src/core/strategies/delayed_strategy.d.ts +15 -0
- package/types/src/core/strategies/first_connected_strategy.d.ts +8 -0
- package/types/src/core/strategies/if_strategy.d.ts +10 -0
- package/types/src/core/strategies/sequential_strategy.d.ts +16 -0
- package/types/src/core/strategies/strategy.d.ts +6 -0
- package/types/src/core/strategies/strategy_builder.d.ts +5 -0
- package/types/src/core/strategies/strategy_options.d.ts +16 -0
- package/types/src/core/strategies/strategy_runner.d.ts +5 -0
- package/types/src/core/strategies/transport_strategy.d.ts +15 -0
- package/types/src/core/strategies/websocket_prioritized_cached_strategy.d.ts +20 -0
- package/types/src/core/timeline/level.d.ts +6 -0
- package/types/src/core/timeline/timeline.d.ts +25 -0
- package/types/src/core/timeline/timeline_sender.d.ts +13 -0
- package/types/src/core/timeline/timeline_transport.d.ts +6 -0
- package/types/src/core/transports/assistant_to_the_transport_manager.d.ts +14 -0
- package/types/src/core/transports/ping_delay_options.d.ts +6 -0
- package/types/src/core/transports/transport.d.ts +8 -0
- package/types/src/core/transports/transport_connection.d.ts +35 -0
- package/types/src/core/transports/transport_connection_options.d.ts +6 -0
- package/types/src/core/transports/transport_hooks.d.ts +13 -0
- package/types/src/core/transports/transport_manager.d.ts +14 -0
- package/types/src/core/transports/transports_table.d.ts +10 -0
- package/types/src/core/transports/url_scheme.d.ts +11 -0
- package/types/src/core/transports/url_schemes.d.ts +4 -0
- package/types/src/core/user.d.ts +21 -0
- package/types/src/core/util.d.ts +8 -0
- package/types/src/core/utils/collections.d.ts +18 -0
- package/types/src/core/utils/factory.d.ts +29 -0
- package/types/src/core/utils/flat_promise.d.ts +6 -0
- package/types/src/core/utils/timers/abstract_timer.d.ts +10 -0
- package/types/src/core/utils/timers/index.d.ts +9 -0
- package/types/src/core/utils/timers/scheduling.d.ts +8 -0
- package/types/src/core/utils/timers/timed_callback.d.ts +4 -0
- package/types/src/core/utils/url_store.d.ts +4 -0
- package/types/src/core/watchlist.d.ts +8 -0
- package/types/src/runtimes/interface.d.ts +43 -0
- package/types/src/runtimes/isomorphic/auth/xhr_auth.d.ts +3 -0
- package/types/src/runtimes/isomorphic/default_strategy.d.ts +5 -0
- package/types/src/runtimes/isomorphic/http/http.d.ts +3 -0
- package/types/src/runtimes/isomorphic/http/http_xhr_request.d.ts +3 -0
- package/types/src/runtimes/isomorphic/runtime.d.ts +2 -0
- package/types/src/runtimes/isomorphic/timeline/xhr_timeline.d.ts +6 -0
- package/types/src/runtimes/isomorphic/transports/transport_connection_initializer.d.ts +1 -0
- package/types/src/runtimes/isomorphic/transports/transports.d.ts +5 -0
- package/types/src/runtimes/node/net_info.d.ts +6 -0
- package/types/src/runtimes/node/runtime.d.ts +3 -0
- package/types/src/runtimes/react-native/net_info.d.ts +8 -0
- package/types/src/runtimes/react-native/runtime.d.ts +3 -0
- package/types/src/runtimes/web/auth/jsonp_auth.d.ts +3 -0
- package/types/src/runtimes/web/browser.d.ts +19 -0
- package/types/src/runtimes/web/default_strategy.d.ts +5 -0
- package/types/src/runtimes/web/dom/dependencies.d.ts +4 -0
- package/types/src/runtimes/web/dom/dependency_loader.d.ts +10 -0
- package/types/src/runtimes/web/dom/jsonp_request.d.ts +10 -0
- package/types/src/runtimes/web/dom/script_receiver.d.ts +7 -0
- package/types/src/runtimes/web/dom/script_receiver_factory.d.ts +10 -0
- package/types/src/runtimes/web/dom/script_request.d.ts +9 -0
- package/types/src/runtimes/web/http/http.d.ts +2 -0
- package/types/src/runtimes/web/http/http_xdomain_request.d.ts +3 -0
- package/types/src/runtimes/web/net_info.d.ts +7 -0
- package/types/src/runtimes/web/runtime.d.ts +3 -0
- package/types/src/runtimes/web/timeline/jsonp_timeline.d.ts +6 -0
- package/types/src/runtimes/web/transports/transport_connection_initializer.d.ts +1 -0
- package/types/src/runtimes/web/transports/transports.d.ts +2 -0
- package/types/src/runtimes/worker/auth/fetch_auth.d.ts +3 -0
- package/types/src/runtimes/worker/net_info.d.ts +6 -0
- package/types/src/runtimes/worker/runtime.d.ts +3 -0
- package/types/src/runtimes/worker/timeline/fetch_timeline.d.ts +6 -0
- package/vite.config.js +52 -0
- package/vite.config.node.js +72 -0
- package/webpack/config.node.js +26 -0
- package/webpack/config.react-native.js +35 -0
- package/webpack/config.shared.js +50 -0
- package/webpack/config.web.js +36 -0
- package/webpack/config.worker.js +42 -0
- package/webpack/dev.server.js +17 -0
- package/webpack/hosting_config.js +6 -0
- package/with-encryption/index.d.ts +29 -0
- package/with-encryption/index.js +4 -0
- package/worker/index.d.ts +29 -0
- package/worker/index.js +1 -0
- package/worker/with-encryption/index.d.ts +29 -0
- package/worker/with-encryption/index.js +1 -0
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { default as EventsDispatcher } from '../events/dispatcher';
|
|
2
|
+
import { OneOffTimer as Timer } from '../utils/timers';
|
|
3
|
+
import { Config } from '../config';
|
|
4
|
+
import Logger from '../logger';
|
|
5
|
+
import HandshakePayload from './handshake/handshake_payload';
|
|
6
|
+
import Connection from './connection';
|
|
7
|
+
import Strategy from '../strategies/strategy';
|
|
8
|
+
import StrategyRunner from '../strategies/strategy_runner';
|
|
9
|
+
import * as Collections from '../utils/collections';
|
|
10
|
+
import Timeline from '../timeline/timeline';
|
|
11
|
+
import ConnectionManagerOptions from './connection_manager_options';
|
|
12
|
+
import Runtime from 'runtime';
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
ErrorCallbacks,
|
|
16
|
+
HandshakeCallbacks,
|
|
17
|
+
ConnectionCallbacks,
|
|
18
|
+
} from './callbacks';
|
|
19
|
+
import Action from './protocol/action';
|
|
20
|
+
|
|
21
|
+
/** Manages connection to Pusher.
|
|
22
|
+
*
|
|
23
|
+
* Uses a strategy (currently only default), timers and network availability
|
|
24
|
+
* info to establish a connection and export its state. In case of failures,
|
|
25
|
+
* manages reconnection attempts.
|
|
26
|
+
*
|
|
27
|
+
* Exports state changes as following events:
|
|
28
|
+
* - "state_change", { previous: p, current: state }
|
|
29
|
+
* - state
|
|
30
|
+
*
|
|
31
|
+
* States:
|
|
32
|
+
* - initialized - initial state, never transitioned to
|
|
33
|
+
* - connecting - connection is being established
|
|
34
|
+
* - connected - connection has been fully established
|
|
35
|
+
* - disconnected - on requested disconnection
|
|
36
|
+
* - unavailable - after connection timeout or when there's no network
|
|
37
|
+
* - failed - when the connection strategy is not supported
|
|
38
|
+
*
|
|
39
|
+
* Options:
|
|
40
|
+
* - unavailableTimeout - time to transition to unavailable state
|
|
41
|
+
* - activityTimeout - time after which ping message should be sent
|
|
42
|
+
* - pongTimeout - time for Pusher to respond with pong before reconnecting
|
|
43
|
+
*
|
|
44
|
+
* @param {String} key application key
|
|
45
|
+
* @param {Object} options
|
|
46
|
+
*/
|
|
47
|
+
export default class ConnectionManager extends EventsDispatcher {
|
|
48
|
+
key: string;
|
|
49
|
+
options: ConnectionManagerOptions;
|
|
50
|
+
state: string;
|
|
51
|
+
connection: Connection;
|
|
52
|
+
usingTLS: boolean;
|
|
53
|
+
timeline: Timeline;
|
|
54
|
+
socket_id: string;
|
|
55
|
+
unavailableTimer: Timer;
|
|
56
|
+
activityTimer: Timer;
|
|
57
|
+
retryTimer: Timer;
|
|
58
|
+
activityTimeout: number;
|
|
59
|
+
strategy: Strategy;
|
|
60
|
+
runner: StrategyRunner;
|
|
61
|
+
errorCallbacks: ErrorCallbacks;
|
|
62
|
+
handshakeCallbacks: HandshakeCallbacks;
|
|
63
|
+
connectionCallbacks: ConnectionCallbacks;
|
|
64
|
+
|
|
65
|
+
constructor(key: string, options: ConnectionManagerOptions) {
|
|
66
|
+
super();
|
|
67
|
+
this.state = 'initialized';
|
|
68
|
+
this.connection = null;
|
|
69
|
+
|
|
70
|
+
this.key = key;
|
|
71
|
+
this.options = options;
|
|
72
|
+
this.timeline = this.options.timeline;
|
|
73
|
+
this.usingTLS = this.options.useTLS;
|
|
74
|
+
|
|
75
|
+
this.errorCallbacks = this.buildErrorCallbacks();
|
|
76
|
+
this.connectionCallbacks = this.buildConnectionCallbacks(
|
|
77
|
+
this.errorCallbacks,
|
|
78
|
+
);
|
|
79
|
+
this.handshakeCallbacks = this.buildHandshakeCallbacks(this.errorCallbacks);
|
|
80
|
+
|
|
81
|
+
var Network = Runtime.getNetwork();
|
|
82
|
+
|
|
83
|
+
Network.bind('online', () => {
|
|
84
|
+
this.timeline.info({ netinfo: 'online' });
|
|
85
|
+
if (this.state === 'connecting' || this.state === 'unavailable') {
|
|
86
|
+
this.retryIn(0);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
Network.bind('offline', () => {
|
|
90
|
+
this.timeline.info({ netinfo: 'offline' });
|
|
91
|
+
if (this.connection) {
|
|
92
|
+
this.sendActivityCheck();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
this.updateStrategy();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Establishes a connection to Pusher.
|
|
100
|
+
*
|
|
101
|
+
* Does nothing when connection is already established. See top-level doc
|
|
102
|
+
* to find events emitted on connection attempts.
|
|
103
|
+
*/
|
|
104
|
+
connect() {
|
|
105
|
+
if (this.connection || this.runner) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (!this.strategy.isSupported()) {
|
|
109
|
+
this.updateState('failed');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.updateState('connecting');
|
|
113
|
+
this.startConnecting();
|
|
114
|
+
this.setUnavailableTimer();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Sends raw data.
|
|
118
|
+
*
|
|
119
|
+
* @param {String} data
|
|
120
|
+
*/
|
|
121
|
+
send(data) {
|
|
122
|
+
if (this.connection) {
|
|
123
|
+
return this.connection.send(data);
|
|
124
|
+
} else {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Sends an event.
|
|
130
|
+
*
|
|
131
|
+
* @param {String} name
|
|
132
|
+
* @param {String} data
|
|
133
|
+
* @param {String} [channel]
|
|
134
|
+
* @returns {Boolean} whether message was sent or not
|
|
135
|
+
*/
|
|
136
|
+
send_event(name: string, data: any, channel?: string) {
|
|
137
|
+
if (this.connection) {
|
|
138
|
+
return this.connection.send_event(name, data, channel);
|
|
139
|
+
} else {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Closes the connection. */
|
|
145
|
+
disconnect() {
|
|
146
|
+
this.disconnectInternally();
|
|
147
|
+
this.updateState('disconnected');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
isUsingTLS() {
|
|
151
|
+
return this.usingTLS;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private startConnecting() {
|
|
155
|
+
var callback = (error, handshake) => {
|
|
156
|
+
if (error) {
|
|
157
|
+
this.runner = this.strategy.connect(0, callback);
|
|
158
|
+
} else {
|
|
159
|
+
if (handshake.action === 'error') {
|
|
160
|
+
this.emit('error', {
|
|
161
|
+
type: 'HandshakeError',
|
|
162
|
+
error: handshake.error,
|
|
163
|
+
});
|
|
164
|
+
this.timeline.error({ handshakeError: handshake.error });
|
|
165
|
+
} else {
|
|
166
|
+
this.abortConnecting(); // we don't support switching connections yet
|
|
167
|
+
this.handshakeCallbacks[handshake.action](handshake);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
this.runner = this.strategy.connect(0, callback);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
private abortConnecting() {
|
|
175
|
+
if (this.runner) {
|
|
176
|
+
this.runner.abort();
|
|
177
|
+
this.runner = null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private disconnectInternally() {
|
|
182
|
+
this.abortConnecting();
|
|
183
|
+
this.clearRetryTimer();
|
|
184
|
+
this.clearUnavailableTimer();
|
|
185
|
+
if (this.connection) {
|
|
186
|
+
var connection = this.abandonConnection();
|
|
187
|
+
connection.close();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private updateStrategy() {
|
|
192
|
+
this.strategy = this.options.getStrategy({
|
|
193
|
+
key: this.key,
|
|
194
|
+
timeline: this.timeline,
|
|
195
|
+
useTLS: this.usingTLS,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private retryIn(delay) {
|
|
200
|
+
this.timeline.info({ action: 'retry', delay: delay });
|
|
201
|
+
if (delay > 0) {
|
|
202
|
+
this.emit('connecting_in', Math.round(delay / 1000));
|
|
203
|
+
}
|
|
204
|
+
this.retryTimer = new Timer(delay || 0, () => {
|
|
205
|
+
this.disconnectInternally();
|
|
206
|
+
this.connect();
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
private clearRetryTimer() {
|
|
211
|
+
if (this.retryTimer) {
|
|
212
|
+
this.retryTimer.ensureAborted();
|
|
213
|
+
this.retryTimer = null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
private setUnavailableTimer() {
|
|
218
|
+
this.unavailableTimer = new Timer(this.options.unavailableTimeout, () => {
|
|
219
|
+
this.updateState('unavailable');
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
private clearUnavailableTimer() {
|
|
224
|
+
if (this.unavailableTimer) {
|
|
225
|
+
this.unavailableTimer.ensureAborted();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
private sendActivityCheck() {
|
|
230
|
+
this.stopActivityCheck();
|
|
231
|
+
this.connection.ping();
|
|
232
|
+
// wait for pong response
|
|
233
|
+
this.activityTimer = new Timer(this.options.pongTimeout, () => {
|
|
234
|
+
this.timeline.error({ pong_timed_out: this.options.pongTimeout });
|
|
235
|
+
this.retryIn(0);
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
private resetActivityCheck() {
|
|
240
|
+
this.stopActivityCheck();
|
|
241
|
+
// send ping after inactivity
|
|
242
|
+
if (this.connection && !this.connection.handlesActivityChecks()) {
|
|
243
|
+
this.activityTimer = new Timer(this.activityTimeout, () => {
|
|
244
|
+
this.sendActivityCheck();
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private stopActivityCheck() {
|
|
250
|
+
if (this.activityTimer) {
|
|
251
|
+
this.activityTimer.ensureAborted();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
private buildConnectionCallbacks(
|
|
256
|
+
errorCallbacks: ErrorCallbacks,
|
|
257
|
+
): ConnectionCallbacks {
|
|
258
|
+
return Collections.extend<ConnectionCallbacks>({}, errorCallbacks, {
|
|
259
|
+
message: (message) => {
|
|
260
|
+
// includes pong messages from server
|
|
261
|
+
this.resetActivityCheck();
|
|
262
|
+
this.emit('message', message);
|
|
263
|
+
},
|
|
264
|
+
ping: () => {
|
|
265
|
+
this.send_event('pusher:pong', {});
|
|
266
|
+
},
|
|
267
|
+
activity: () => {
|
|
268
|
+
this.resetActivityCheck();
|
|
269
|
+
},
|
|
270
|
+
error: (error) => {
|
|
271
|
+
// just emit error to user - socket will already be closed by browser
|
|
272
|
+
this.emit('error', error);
|
|
273
|
+
},
|
|
274
|
+
closed: () => {
|
|
275
|
+
this.abandonConnection();
|
|
276
|
+
if (this.shouldRetry()) {
|
|
277
|
+
this.retryIn(1000);
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
private buildHandshakeCallbacks(
|
|
284
|
+
errorCallbacks: ErrorCallbacks,
|
|
285
|
+
): HandshakeCallbacks {
|
|
286
|
+
return Collections.extend<HandshakeCallbacks>({}, errorCallbacks, {
|
|
287
|
+
connected: (handshake: HandshakePayload) => {
|
|
288
|
+
this.activityTimeout = Math.min(
|
|
289
|
+
this.options.activityTimeout,
|
|
290
|
+
handshake.activityTimeout,
|
|
291
|
+
handshake.connection.activityTimeout || Infinity,
|
|
292
|
+
);
|
|
293
|
+
this.clearUnavailableTimer();
|
|
294
|
+
this.setConnection(handshake.connection);
|
|
295
|
+
this.socket_id = this.connection.id;
|
|
296
|
+
this.updateState('connected', { socket_id: this.socket_id });
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
private buildErrorCallbacks(): ErrorCallbacks {
|
|
302
|
+
let withErrorEmitted = (callback) => {
|
|
303
|
+
return (result: Action | HandshakePayload) => {
|
|
304
|
+
if (result.error) {
|
|
305
|
+
this.emit('error', { type: 'WebSocketError', error: result.error });
|
|
306
|
+
}
|
|
307
|
+
callback(result);
|
|
308
|
+
};
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
return {
|
|
312
|
+
tls_only: withErrorEmitted(() => {
|
|
313
|
+
this.usingTLS = true;
|
|
314
|
+
this.updateStrategy();
|
|
315
|
+
this.retryIn(0);
|
|
316
|
+
}),
|
|
317
|
+
refused: withErrorEmitted(() => {
|
|
318
|
+
this.disconnect();
|
|
319
|
+
}),
|
|
320
|
+
backoff: withErrorEmitted(() => {
|
|
321
|
+
this.retryIn(1000);
|
|
322
|
+
}),
|
|
323
|
+
retry: withErrorEmitted(() => {
|
|
324
|
+
this.retryIn(0);
|
|
325
|
+
}),
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
private setConnection(connection) {
|
|
330
|
+
this.connection = connection;
|
|
331
|
+
for (var event in this.connectionCallbacks) {
|
|
332
|
+
this.connection.bind(event, this.connectionCallbacks[event]);
|
|
333
|
+
}
|
|
334
|
+
this.resetActivityCheck();
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
private abandonConnection() {
|
|
338
|
+
if (!this.connection) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
this.stopActivityCheck();
|
|
342
|
+
for (var event in this.connectionCallbacks) {
|
|
343
|
+
this.connection.unbind(event, this.connectionCallbacks[event]);
|
|
344
|
+
}
|
|
345
|
+
var connection = this.connection;
|
|
346
|
+
this.connection = null;
|
|
347
|
+
return connection;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
private updateState(newState: string, data?: any) {
|
|
351
|
+
var previousState = this.state;
|
|
352
|
+
this.state = newState;
|
|
353
|
+
if (previousState !== newState) {
|
|
354
|
+
var newStateDescription = newState;
|
|
355
|
+
if (newStateDescription === 'connected') {
|
|
356
|
+
newStateDescription += ' with new socket ID ' + data.socket_id;
|
|
357
|
+
}
|
|
358
|
+
Logger.debug(
|
|
359
|
+
'State changed',
|
|
360
|
+
previousState + ' -> ' + newStateDescription,
|
|
361
|
+
);
|
|
362
|
+
this.timeline.info({ state: newState, params: data });
|
|
363
|
+
this.emit('state_change', { previous: previousState, current: newState });
|
|
364
|
+
this.emit(newState, data);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
private shouldRetry(): boolean {
|
|
369
|
+
return this.state === 'connecting' || this.state === 'connected';
|
|
370
|
+
}
|
|
371
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Timeline from '../timeline/timeline';
|
|
2
|
+
import Strategy from '../strategies/strategy';
|
|
3
|
+
import StategyOptions from '../strategies/strategy_options';
|
|
4
|
+
|
|
5
|
+
interface ConnectionManagerOptions {
|
|
6
|
+
timeline: Timeline;
|
|
7
|
+
getStrategy: (StrategyOptions) => Strategy;
|
|
8
|
+
unavailableTimeout: number;
|
|
9
|
+
pongTimeout: number;
|
|
10
|
+
activityTimeout: number;
|
|
11
|
+
useTLS: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default ConnectionManagerOptions;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import TransportConnection from '../../transports/transport_connection';
|
|
2
|
+
import Action from '../protocol/action';
|
|
3
|
+
import Connection from '../connection';
|
|
4
|
+
|
|
5
|
+
interface HandshakePayload extends Action {
|
|
6
|
+
transport: TransportConnection;
|
|
7
|
+
connection?: Connection;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default HandshakePayload;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import Util from '../../util';
|
|
2
|
+
import * as Collections from '../../utils/collections';
|
|
3
|
+
import Protocol from '../protocol/protocol';
|
|
4
|
+
import Connection from '../connection';
|
|
5
|
+
import TransportConnection from '../../transports/transport_connection';
|
|
6
|
+
import HandshakePayload from './handshake_payload';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Handles Pusher protocol handshakes for transports.
|
|
10
|
+
*
|
|
11
|
+
* Calls back with a result object after handshake is completed. Results
|
|
12
|
+
* always have two fields:
|
|
13
|
+
* - action - string describing action to be taken after the handshake
|
|
14
|
+
* - transport - the transport object passed to the constructor
|
|
15
|
+
*
|
|
16
|
+
* Different actions can set different additional properties on the result.
|
|
17
|
+
* In the case of 'connected' action, there will be a 'connection' property
|
|
18
|
+
* containing a Connection object for the transport. Other actions should
|
|
19
|
+
* carry an 'error' property.
|
|
20
|
+
*
|
|
21
|
+
* @param {AbstractTransport} transport
|
|
22
|
+
* @param {Function} callback
|
|
23
|
+
*/
|
|
24
|
+
export default class Handshake {
|
|
25
|
+
transport: TransportConnection;
|
|
26
|
+
callback: (HandshakePayload) => void;
|
|
27
|
+
onMessage: Function;
|
|
28
|
+
onClosed: Function;
|
|
29
|
+
|
|
30
|
+
constructor(
|
|
31
|
+
transport: TransportConnection,
|
|
32
|
+
callback: (HandshakePayload) => void,
|
|
33
|
+
) {
|
|
34
|
+
this.transport = transport;
|
|
35
|
+
this.callback = callback;
|
|
36
|
+
this.bindListeners();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
close() {
|
|
40
|
+
this.unbindListeners();
|
|
41
|
+
this.transport.close();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private bindListeners() {
|
|
45
|
+
this.onMessage = (m) => {
|
|
46
|
+
this.unbindListeners();
|
|
47
|
+
|
|
48
|
+
var result;
|
|
49
|
+
try {
|
|
50
|
+
result = Protocol.processHandshake(m);
|
|
51
|
+
} catch (e) {
|
|
52
|
+
this.finish('error', { error: e });
|
|
53
|
+
this.transport.close();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (result.action === 'connected') {
|
|
58
|
+
this.finish('connected', {
|
|
59
|
+
connection: new Connection(result.id, this.transport),
|
|
60
|
+
activityTimeout: result.activityTimeout,
|
|
61
|
+
});
|
|
62
|
+
} else {
|
|
63
|
+
this.finish(result.action, { error: result.error });
|
|
64
|
+
this.transport.close();
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
this.onClosed = (closeEvent) => {
|
|
69
|
+
this.unbindListeners();
|
|
70
|
+
|
|
71
|
+
var action = Protocol.getCloseAction(closeEvent) || 'backoff';
|
|
72
|
+
var error = Protocol.getCloseError(closeEvent);
|
|
73
|
+
this.finish(action, { error: error });
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
this.transport.bind('message', this.onMessage);
|
|
77
|
+
this.transport.bind('closed', this.onClosed);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private unbindListeners() {
|
|
81
|
+
this.transport.unbind('message', this.onMessage);
|
|
82
|
+
this.transport.unbind('closed', this.onClosed);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private finish(action: string, params: any) {
|
|
86
|
+
this.callback(
|
|
87
|
+
Collections.extend({ transport: this.transport, action: action }, params),
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface PusherEvent {
|
|
2
|
+
event: string;
|
|
3
|
+
channel?: string;
|
|
4
|
+
data?: any;
|
|
5
|
+
user_id?: string;
|
|
6
|
+
rawMessage?: string; // Raw WebSocket message for delta compression
|
|
7
|
+
sequence?: number; // Delta compression sequence number
|
|
8
|
+
conflation_key?: string; // Delta compression conflation key
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { PusherEvent };
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import Action from './action';
|
|
2
|
+
import { PusherEvent } from './message-types';
|
|
3
|
+
/**
|
|
4
|
+
* Provides functions for handling Pusher protocol-specific messages.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const Protocol = {
|
|
8
|
+
/**
|
|
9
|
+
* Decodes a message in a Pusher format.
|
|
10
|
+
*
|
|
11
|
+
* The MessageEvent we receive from the transport should contain a pusher event
|
|
12
|
+
* (https://pusher.com/docs/pusher_protocol#events) serialized as JSON in the
|
|
13
|
+
* data field
|
|
14
|
+
*
|
|
15
|
+
* The pusher event may contain a data field too, and it may also be
|
|
16
|
+
* serialised as JSON
|
|
17
|
+
*
|
|
18
|
+
* Throws errors when messages are not parse'able.
|
|
19
|
+
*
|
|
20
|
+
* @param {MessageEvent} messageEvent
|
|
21
|
+
* @return {PusherEvent}
|
|
22
|
+
*/
|
|
23
|
+
decodeMessage: function (messageEvent: MessageEvent): PusherEvent {
|
|
24
|
+
try {
|
|
25
|
+
var messageData = JSON.parse(messageEvent.data);
|
|
26
|
+
var pusherEventData = messageData.data;
|
|
27
|
+
if (typeof pusherEventData === 'string') {
|
|
28
|
+
try {
|
|
29
|
+
pusherEventData = JSON.parse(messageData.data);
|
|
30
|
+
} catch (e) {}
|
|
31
|
+
}
|
|
32
|
+
var pusherEvent: PusherEvent = {
|
|
33
|
+
event: messageData.event,
|
|
34
|
+
channel: messageData.channel,
|
|
35
|
+
data: pusherEventData,
|
|
36
|
+
rawMessage: messageEvent.data, // Preserve raw message for delta compression
|
|
37
|
+
};
|
|
38
|
+
if (messageData.user_id) {
|
|
39
|
+
pusherEvent.user_id = messageData.user_id;
|
|
40
|
+
}
|
|
41
|
+
// Copy sequence and conflation_key for delta compression
|
|
42
|
+
// Server sends these as __delta_seq and __conflation_key
|
|
43
|
+
const sequence = messageData.__delta_seq ?? messageData.sequence;
|
|
44
|
+
const conflationKey =
|
|
45
|
+
messageData.__conflation_key ?? messageData.conflation_key;
|
|
46
|
+
if (typeof sequence === 'number') {
|
|
47
|
+
(pusherEvent as any).sequence = sequence;
|
|
48
|
+
}
|
|
49
|
+
if (conflationKey !== undefined) {
|
|
50
|
+
(pusherEvent as any).conflation_key = conflationKey;
|
|
51
|
+
}
|
|
52
|
+
return pusherEvent;
|
|
53
|
+
} catch (e) {
|
|
54
|
+
throw { type: 'MessageParseError', error: e, data: messageEvent.data };
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Encodes a message to be sent.
|
|
60
|
+
*
|
|
61
|
+
* @param {PusherEvent} event
|
|
62
|
+
* @return {String}
|
|
63
|
+
*/
|
|
64
|
+
encodeMessage: function (event: PusherEvent): string {
|
|
65
|
+
return JSON.stringify(event);
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Processes a handshake message and returns appropriate actions.
|
|
70
|
+
*
|
|
71
|
+
* Returns an object with an 'action' and other action-specific properties.
|
|
72
|
+
*
|
|
73
|
+
* There are three outcomes when calling this function. First is a successful
|
|
74
|
+
* connection attempt, when pusher:connection_established is received, which
|
|
75
|
+
* results in a 'connected' action with an 'id' property. When passed a
|
|
76
|
+
* pusher:error event, it returns a result with action appropriate to the
|
|
77
|
+
* close code and an error. Otherwise, it raises an exception.
|
|
78
|
+
*
|
|
79
|
+
* @param {String} message
|
|
80
|
+
* @result Object
|
|
81
|
+
*/
|
|
82
|
+
processHandshake: function (messageEvent: MessageEvent): Action {
|
|
83
|
+
var message = Protocol.decodeMessage(messageEvent);
|
|
84
|
+
|
|
85
|
+
if (message.event === 'pusher:connection_established') {
|
|
86
|
+
if (!message.data.activity_timeout) {
|
|
87
|
+
throw 'No activity timeout specified in handshake';
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
action: 'connected',
|
|
91
|
+
id: message.data.socket_id,
|
|
92
|
+
activityTimeout: message.data.activity_timeout * 1000,
|
|
93
|
+
};
|
|
94
|
+
} else if (message.event === 'pusher:error') {
|
|
95
|
+
// From protocol 6 close codes are sent only once, so this only
|
|
96
|
+
// happens when connection does not support close codes
|
|
97
|
+
return {
|
|
98
|
+
action: this.getCloseAction(message.data),
|
|
99
|
+
error: this.getCloseError(message.data),
|
|
100
|
+
};
|
|
101
|
+
} else {
|
|
102
|
+
throw 'Invalid handshake';
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Dispatches the close event and returns an appropriate action name.
|
|
108
|
+
*
|
|
109
|
+
* See:
|
|
110
|
+
* 1. https://developer.mozilla.org/en-US/docs/WebSockets/WebSockets_reference/CloseEvent
|
|
111
|
+
* 2. http://pusher.com/docs/pusher_protocol
|
|
112
|
+
*
|
|
113
|
+
* @param {CloseEvent} closeEvent
|
|
114
|
+
* @return {String} close action name
|
|
115
|
+
*/
|
|
116
|
+
getCloseAction: function (closeEvent): string {
|
|
117
|
+
if (closeEvent.code < 4000) {
|
|
118
|
+
// ignore 1000 CLOSE_NORMAL, 1001 CLOSE_GOING_AWAY,
|
|
119
|
+
// 1005 CLOSE_NO_STATUS, 1006 CLOSE_ABNORMAL
|
|
120
|
+
// ignore 1007...3999
|
|
121
|
+
// handle 1002 CLOSE_PROTOCOL_ERROR, 1003 CLOSE_UNSUPPORTED,
|
|
122
|
+
// 1004 CLOSE_TOO_LARGE
|
|
123
|
+
if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {
|
|
124
|
+
return 'backoff';
|
|
125
|
+
} else {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
} else if (closeEvent.code === 4000) {
|
|
129
|
+
return 'tls_only';
|
|
130
|
+
} else if (closeEvent.code < 4100) {
|
|
131
|
+
return 'refused';
|
|
132
|
+
} else if (closeEvent.code < 4200) {
|
|
133
|
+
return 'backoff';
|
|
134
|
+
} else if (closeEvent.code < 4300) {
|
|
135
|
+
return 'retry';
|
|
136
|
+
} else {
|
|
137
|
+
// unknown error
|
|
138
|
+
return 'refused';
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Returns an error or null basing on the close event.
|
|
144
|
+
*
|
|
145
|
+
* Null is returned when connection was closed cleanly. Otherwise, an object
|
|
146
|
+
* with error details is returned.
|
|
147
|
+
*
|
|
148
|
+
* @param {CloseEvent} closeEvent
|
|
149
|
+
* @return {Object} error object
|
|
150
|
+
*/
|
|
151
|
+
getCloseError: function (closeEvent): any {
|
|
152
|
+
if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {
|
|
153
|
+
return {
|
|
154
|
+
type: 'PusherError',
|
|
155
|
+
data: {
|
|
156
|
+
code: closeEvent.code,
|
|
157
|
+
message: closeEvent.reason || closeEvent.message,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
} else {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export default Protocol;
|