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