typeferry 0.6.0
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/README.md +88 -0
- package/dist/auth/client/cross-tab-sync.d.ts +21 -0
- package/dist/auth/client/cross-tab-sync.js +56 -0
- package/dist/auth/client/cross-tab-sync.js.map +1 -0
- package/dist/auth/client/index.d.ts +2 -0
- package/dist/auth/client/index.js +3 -0
- package/dist/auth/client/index.js.map +1 -0
- package/dist/auth/client/oauth/google-provider.d.ts +11 -0
- package/dist/auth/client/oauth/google-provider.js +11 -0
- package/dist/auth/client/oauth/google-provider.js.map +1 -0
- package/dist/auth/client/oauth/index.d.ts +4 -0
- package/dist/auth/client/oauth/index.js +3 -0
- package/dist/auth/client/oauth/index.js.map +1 -0
- package/dist/auth/client/oauth/use-google-login.d.ts +39 -0
- package/dist/auth/client/oauth/use-google-login.js +55 -0
- package/dist/auth/client/oauth/use-google-login.js.map +1 -0
- package/dist/auth/client/token-refresh.d.ts +21 -0
- package/dist/auth/client/token-refresh.js +212 -0
- package/dist/auth/client/token-refresh.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.js +9 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/server/cookie-utils.d.ts +42 -0
- package/dist/auth/server/cookie-utils.js +91 -0
- package/dist/auth/server/cookie-utils.js.map +1 -0
- package/dist/auth/server/device-info.d.ts +23 -0
- package/dist/auth/server/device-info.js +52 -0
- package/dist/auth/server/device-info.js.map +1 -0
- package/dist/auth/server/index.d.ts +4 -0
- package/dist/auth/server/index.js +5 -0
- package/dist/auth/server/index.js.map +1 -0
- package/dist/auth/server/jwt-utils.d.ts +29 -0
- package/dist/auth/server/jwt-utils.js +53 -0
- package/dist/auth/server/jwt-utils.js.map +1 -0
- package/dist/auth/server/oauth/google.d.ts +31 -0
- package/dist/auth/server/oauth/google.js +40 -0
- package/dist/auth/server/oauth/google.js.map +1 -0
- package/dist/auth/server/oauth/index.d.ts +3 -0
- package/dist/auth/server/oauth/index.js +2 -0
- package/dist/auth/server/oauth/index.js.map +1 -0
- package/dist/auth/server/oauth/types.d.ts +37 -0
- package/dist/auth/server/oauth/types.js +2 -0
- package/dist/auth/server/oauth/types.js.map +1 -0
- package/dist/auth/server/session-manager.d.ts +46 -0
- package/dist/auth/server/session-manager.js +167 -0
- package/dist/auth/server/session-manager.js.map +1 -0
- package/dist/auth/types.d.ts +197 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/client/call-method-proxy.d.ts +2 -0
- package/dist/client/call-method-proxy.js +22 -0
- package/dist/client/call-method-proxy.js.map +1 -0
- package/dist/client/client-channel.d.ts +43 -0
- package/dist/client/client-channel.js +148 -0
- package/dist/client/client-channel.js.map +1 -0
- package/dist/client/client-http.d.ts +27 -0
- package/dist/client/client-http.js +106 -0
- package/dist/client/client-http.js.map +1 -0
- package/dist/client/client-socket.d.ts +85 -0
- package/dist/client/client-socket.js +317 -0
- package/dist/client/client-socket.js.map +1 -0
- package/dist/client/client.d.ts +149 -0
- package/dist/client/client.js +401 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/context-manager.d.ts +54 -0
- package/dist/client/context-manager.js +89 -0
- package/dist/client/context-manager.js.map +1 -0
- package/dist/client/idle-timer.d.ts +35 -0
- package/dist/client/idle-timer.js +101 -0
- package/dist/client/idle-timer.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/logger.d.ts +76 -0
- package/dist/client/logger.js +129 -0
- package/dist/client/logger.js.map +1 -0
- package/dist/client/visibility-manager.d.ts +62 -0
- package/dist/client/visibility-manager.js +177 -0
- package/dist/client/visibility-manager.js.map +1 -0
- package/dist/ejson/adjust-types-from-json-value.d.ts +1 -0
- package/dist/ejson/adjust-types-from-json-value.js +35 -0
- package/dist/ejson/adjust-types-from-json-value.js.map +1 -0
- package/dist/ejson/base64.d.ts +11 -0
- package/dist/ejson/base64.js +87 -0
- package/dist/ejson/base64.js.map +1 -0
- package/dist/ejson/built-in-converters.d.ts +1 -0
- package/dist/ejson/built-in-converters.js +137 -0
- package/dist/ejson/built-in-converters.js.map +1 -0
- package/dist/ejson/clone.d.ts +1 -0
- package/dist/ejson/clone.js +80 -0
- package/dist/ejson/clone.js.map +1 -0
- package/dist/ejson/custom-models.d.ts +38 -0
- package/dist/ejson/custom-models.js +76 -0
- package/dist/ejson/custom-models.js.map +1 -0
- package/dist/ejson/custom-types.d.ts +1 -0
- package/dist/ejson/custom-types.js +2 -0
- package/dist/ejson/custom-types.js.map +1 -0
- package/dist/ejson/equals.d.ts +1 -0
- package/dist/ejson/equals.js +117 -0
- package/dist/ejson/equals.js.map +1 -0
- package/dist/ejson/from-json-value.d.ts +1 -0
- package/dist/ejson/from-json-value.js +13 -0
- package/dist/ejson/from-json-value.js.map +1 -0
- package/dist/ejson/helpers/adjust-types-to-json-value.d.ts +1 -0
- package/dist/ejson/helpers/adjust-types-to-json-value.js +36 -0
- package/dist/ejson/helpers/adjust-types-to-json-value.js.map +1 -0
- package/dist/ejson/helpers/from-json-value-helper.d.ts +1 -0
- package/dist/ejson/helpers/from-json-value-helper.js +24 -0
- package/dist/ejson/helpers/from-json-value-helper.js.map +1 -0
- package/dist/ejson/helpers/to-json-value-helper.d.ts +1 -0
- package/dist/ejson/helpers/to-json-value-helper.js +15 -0
- package/dist/ejson/helpers/to-json-value-helper.js.map +1 -0
- package/dist/ejson/index.d.ts +27 -0
- package/dist/ejson/index.js +54 -0
- package/dist/ejson/index.js.map +1 -0
- package/dist/ejson/is-binary.d.ts +2 -0
- package/dist/ejson/is-binary.js +5 -0
- package/dist/ejson/is-binary.js.map +1 -0
- package/dist/ejson/parse.d.ts +6 -0
- package/dist/ejson/parse.js +12 -0
- package/dist/ejson/parse.js.map +1 -0
- package/dist/ejson/stable-stringify.d.ts +10 -0
- package/dist/ejson/stable-stringify.js +25 -0
- package/dist/ejson/stable-stringify.js.map +1 -0
- package/dist/ejson/stringify.d.ts +5 -0
- package/dist/ejson/stringify.js +15 -0
- package/dist/ejson/stringify.js.map +1 -0
- package/dist/ejson/to-json-value.d.ts +1 -0
- package/dist/ejson/to-json-value.js +17 -0
- package/dist/ejson/to-json-value.js.map +1 -0
- package/dist/ejson/utils.d.ts +18 -0
- package/dist/ejson/utils.js +43 -0
- package/dist/ejson/utils.js.map +1 -0
- package/dist/mongodb/change-streams.d.ts +31 -0
- package/dist/mongodb/change-streams.js +142 -0
- package/dist/mongodb/change-streams.js.map +1 -0
- package/dist/mongodb/client.d.ts +13 -0
- package/dist/mongodb/client.js +30 -0
- package/dist/mongodb/client.js.map +1 -0
- package/dist/mongodb/decorators/collection.d.ts +9 -0
- package/dist/mongodb/decorators/collection.js +26 -0
- package/dist/mongodb/decorators/collection.js.map +1 -0
- package/dist/mongodb/decorators/index.d.ts +4 -0
- package/dist/mongodb/decorators/index.js +5 -0
- package/dist/mongodb/decorators/index.js.map +1 -0
- package/dist/mongodb/decorators/metadata.d.ts +21 -0
- package/dist/mongodb/decorators/metadata.js +29 -0
- package/dist/mongodb/decorators/metadata.js.map +1 -0
- package/dist/mongodb/decorators/register.d.ts +3 -0
- package/dist/mongodb/decorators/register.js +10 -0
- package/dist/mongodb/decorators/register.js.map +1 -0
- package/dist/mongodb/decorators/watch.d.ts +4 -0
- package/dist/mongodb/decorators/watch.js +10 -0
- package/dist/mongodb/decorators/watch.js.map +1 -0
- package/dist/mongodb/filters.d.ts +20 -0
- package/dist/mongodb/filters.js +40 -0
- package/dist/mongodb/filters.js.map +1 -0
- package/dist/mongodb/find-one-or-create.d.ts +4 -0
- package/dist/mongodb/find-one-or-create.js +16 -0
- package/dist/mongodb/find-one-or-create.js.map +1 -0
- package/dist/mongodb/index.d.ts +10 -0
- package/dist/mongodb/index.js +11 -0
- package/dist/mongodb/index.js.map +1 -0
- package/dist/mongodb/live/client.d.ts +52 -0
- package/dist/mongodb/live/client.js +266 -0
- package/dist/mongodb/live/client.js.map +1 -0
- package/dist/mongodb/live/engine.d.ts +55 -0
- package/dist/mongodb/live/engine.js +440 -0
- package/dist/mongodb/live/engine.js.map +1 -0
- package/dist/mongodb/live/index.d.ts +5 -0
- package/dist/mongodb/live/index.js +6 -0
- package/dist/mongodb/live/index.js.map +1 -0
- package/dist/mongodb/live/observer.d.ts +58 -0
- package/dist/mongodb/live/observer.js +246 -0
- package/dist/mongodb/live/observer.js.map +1 -0
- package/dist/mongodb/live/publication.d.ts +4 -0
- package/dist/mongodb/live/publication.js +30 -0
- package/dist/mongodb/live/publication.js.map +1 -0
- package/dist/mongodb/live/source.d.ts +55 -0
- package/dist/mongodb/live/source.js +197 -0
- package/dist/mongodb/live/source.js.map +1 -0
- package/dist/mongodb/live/types.d.ts +266 -0
- package/dist/mongodb/live/types.js +29 -0
- package/dist/mongodb/live/types.js.map +1 -0
- package/dist/mongodb/live/window.d.ts +7 -0
- package/dist/mongodb/live/window.js +93 -0
- package/dist/mongodb/live/window.js.map +1 -0
- package/dist/mongodb/registry.d.ts +35 -0
- package/dist/mongodb/registry.js +129 -0
- package/dist/mongodb/registry.js.map +1 -0
- package/dist/mongodb/schema.d.ts +16 -0
- package/dist/mongodb/schema.js +43 -0
- package/dist/mongodb/schema.js.map +1 -0
- package/dist/mongodb/timestamps.d.ts +17 -0
- package/dist/mongodb/timestamps.js +27 -0
- package/dist/mongodb/timestamps.js.map +1 -0
- package/dist/mongodb/types.d.ts +120 -0
- package/dist/mongodb/types.js +10 -0
- package/dist/mongodb/types.js.map +1 -0
- package/dist/react/components/client-provider.d.ts +8 -0
- package/dist/react/components/client-provider.js +23 -0
- package/dist/react/components/client-provider.js.map +1 -0
- package/dist/react/components/index.d.ts +1 -0
- package/dist/react/components/index.js +2 -0
- package/dist/react/components/index.js.map +1 -0
- package/dist/react/hooks/index.d.ts +13 -0
- package/dist/react/hooks/index.js +14 -0
- package/dist/react/hooks/index.js.map +1 -0
- package/dist/react/hooks/use-auth.d.ts +4 -0
- package/dist/react/hooks/use-auth.js +35 -0
- package/dist/react/hooks/use-auth.js.map +1 -0
- package/dist/react/hooks/use-caller.d.ts +5 -0
- package/dist/react/hooks/use-caller.js +13 -0
- package/dist/react/hooks/use-caller.js.map +1 -0
- package/dist/react/hooks/use-channel.d.ts +1 -0
- package/dist/react/hooks/use-channel.js +7 -0
- package/dist/react/hooks/use-channel.js.map +1 -0
- package/dist/react/hooks/use-circuit-breaker.d.ts +6 -0
- package/dist/react/hooks/use-circuit-breaker.js +16 -0
- package/dist/react/hooks/use-circuit-breaker.js.map +1 -0
- package/dist/react/hooks/use-client.d.ts +3 -0
- package/dist/react/hooks/use-client.js +13 -0
- package/dist/react/hooks/use-client.js.map +1 -0
- package/dist/react/hooks/use-connection-state.d.ts +13 -0
- package/dist/react/hooks/use-connection-state.js +55 -0
- package/dist/react/hooks/use-connection-state.js.map +1 -0
- package/dist/react/hooks/use-creation.d.ts +5 -0
- package/dist/react/hooks/use-creation.js +17 -0
- package/dist/react/hooks/use-creation.js.map +1 -0
- package/dist/react/hooks/use-deps-change.d.ts +1 -0
- package/dist/react/hooks/use-deps-change.js +11 -0
- package/dist/react/hooks/use-deps-change.js.map +1 -0
- package/dist/react/hooks/use-local-event.d.ts +13 -0
- package/dist/react/hooks/use-local-event.js +32 -0
- package/dist/react/hooks/use-local-event.js.map +1 -0
- package/dist/react/hooks/use-method-refresh.d.ts +15 -0
- package/dist/react/hooks/use-method-refresh.js +48 -0
- package/dist/react/hooks/use-method-refresh.js.map +1 -0
- package/dist/react/hooks/use-method.d.ts +26 -0
- package/dist/react/hooks/use-method.js +161 -0
- package/dist/react/hooks/use-method.js.map +1 -0
- package/dist/react/hooks/use-mongodb-live-publication.d.ts +13 -0
- package/dist/react/hooks/use-mongodb-live-publication.js +26 -0
- package/dist/react/hooks/use-mongodb-live-publication.js.map +1 -0
- package/dist/react/hooks/use-object.d.ts +2 -0
- package/dist/react/hooks/use-object.js +22 -0
- package/dist/react/hooks/use-object.js.map +1 -0
- package/dist/react/hooks/use-subscribe.d.ts +8 -0
- package/dist/react/hooks/use-subscribe.js +49 -0
- package/dist/react/hooks/use-subscribe.js.map +1 -0
- package/dist/react/hooks/use-throttled-events.d.ts +7 -0
- package/dist/react/hooks/use-throttled-events.js +11 -0
- package/dist/react/hooks/use-throttled-events.js.map +1 -0
- package/dist/react/hooks/use-token-refresh.d.ts +13 -0
- package/dist/react/hooks/use-token-refresh.js +40 -0
- package/dist/react/hooks/use-token-refresh.js.map +1 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +1 -0
- package/dist/server/client-node.d.ts +76 -0
- package/dist/server/client-node.js +159 -0
- package/dist/server/client-node.js.map +1 -0
- package/dist/server/create-method-proxy.d.ts +2 -0
- package/dist/server/create-method-proxy.js +16 -0
- package/dist/server/create-method-proxy.js.map +1 -0
- package/dist/server/decorators/cached.d.ts +37 -0
- package/dist/server/decorators/cached.js +65 -0
- package/dist/server/decorators/cached.js.map +1 -0
- package/dist/server/decorators/index.d.ts +14 -0
- package/dist/server/decorators/index.js +13 -0
- package/dist/server/decorators/index.js.map +1 -0
- package/dist/server/decorators/infer.d.ts +78 -0
- package/dist/server/decorators/infer.js +11 -0
- package/dist/server/decorators/infer.js.map +1 -0
- package/dist/server/decorators/metadata.d.ts +60 -0
- package/dist/server/decorators/metadata.js +77 -0
- package/dist/server/decorators/metadata.js.map +1 -0
- package/dist/server/decorators/method.d.ts +14 -0
- package/dist/server/decorators/method.js +25 -0
- package/dist/server/decorators/method.js.map +1 -0
- package/dist/server/decorators/namespace.d.ts +25 -0
- package/dist/server/decorators/namespace.js +34 -0
- package/dist/server/decorators/namespace.js.map +1 -0
- package/dist/server/decorators/protected.d.ts +36 -0
- package/dist/server/decorators/protected.js +61 -0
- package/dist/server/decorators/protected.js.map +1 -0
- package/dist/server/decorators/register.d.ts +25 -0
- package/dist/server/decorators/register.js +72 -0
- package/dist/server/decorators/register.js.map +1 -0
- package/dist/server/decorators/schema.d.ts +17 -0
- package/dist/server/decorators/schema.js +27 -0
- package/dist/server/decorators/schema.js.map +1 -0
- package/dist/server/decorators/use.d.ts +22 -0
- package/dist/server/decorators/use.js +32 -0
- package/dist/server/decorators/use.js.map +1 -0
- package/dist/server/default-methods.d.ts +8 -0
- package/dist/server/default-methods.js +8 -0
- package/dist/server/default-methods.js.map +1 -0
- package/dist/server/event.d.ts +42 -0
- package/dist/server/event.js +53 -0
- package/dist/server/event.js.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +11 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/method.d.ts +95 -0
- package/dist/server/method.js +113 -0
- package/dist/server/method.js.map +1 -0
- package/dist/server/methods.d.ts +11 -0
- package/dist/server/methods.js +74 -0
- package/dist/server/methods.js.map +1 -0
- package/dist/server/request-types.d.ts +20 -0
- package/dist/server/request-types.js +8 -0
- package/dist/server/request-types.js.map +1 -0
- package/dist/server/room-registry.d.ts +28 -0
- package/dist/server/room-registry.js +83 -0
- package/dist/server/room-registry.js.map +1 -0
- package/dist/server/server-channel.d.ts +32 -0
- package/dist/server/server-channel.js +104 -0
- package/dist/server/server-channel.js.map +1 -0
- package/dist/server/server.d.ts +124 -0
- package/dist/server/server.js +243 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/transports/hono-rate-limit.d.ts +15 -0
- package/dist/server/transports/hono-rate-limit.js +36 -0
- package/dist/server/transports/hono-rate-limit.js.map +1 -0
- package/dist/server/transports/index.d.ts +4 -0
- package/dist/server/transports/index.js +5 -0
- package/dist/server/transports/index.js.map +1 -0
- package/dist/server/transports/node-hono-transport-contract.d.ts +16 -0
- package/dist/server/transports/node-hono-transport-contract.js +18 -0
- package/dist/server/transports/node-hono-transport-contract.js.map +1 -0
- package/dist/server/transports/node-hono-transport.d.ts +47 -0
- package/dist/server/transports/node-hono-transport.js +327 -0
- package/dist/server/transports/node-hono-transport.js.map +1 -0
- package/dist/server/transports/redis-transport.d.ts +34 -0
- package/dist/server/transports/redis-transport.js +84 -0
- package/dist/server/transports/redis-transport.js.map +1 -0
- package/dist/server/transports/websocket-transport.d.ts +42 -0
- package/dist/server/transports/websocket-transport.js +174 -0
- package/dist/server/transports/websocket-transport.js.map +1 -0
- package/dist/server/transports/ws-shared.d.ts +37 -0
- package/dist/server/transports/ws-shared.js +188 -0
- package/dist/server/transports/ws-shared.js.map +1 -0
- package/dist/server/typeferry-async-local-storage.d.ts +5 -0
- package/dist/server/typeferry-async-local-storage.js +6 -0
- package/dist/server/typeferry-async-local-storage.js.map +1 -0
- package/dist/server/types.d.ts +27 -0
- package/dist/server/types.js +11 -0
- package/dist/server/types.js.map +1 -0
- package/dist/utils/constants.d.ts +72 -0
- package/dist/utils/constants.js +79 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/environment.d.ts +8 -0
- package/dist/utils/environment.js +17 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/errors.d.ts +26 -0
- package/dist/utils/errors.js +35 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/event-emitter.d.ts +37 -0
- package/dist/utils/event-emitter.js +104 -0
- package/dist/utils/event-emitter.js.map +1 -0
- package/dist/utils/events.d.ts +7 -0
- package/dist/utils/events.js +23 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/helpers.d.ts +14 -0
- package/dist/utils/helpers.js +40 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/intercept.d.ts +7 -0
- package/dist/utils/intercept.js +21 -0
- package/dist/utils/intercept.js.map +1 -0
- package/dist/utils/iterator.d.ts +9 -0
- package/dist/utils/iterator.js +28 -0
- package/dist/utils/iterator.js.map +1 -0
- package/dist/utils/lodash.d.ts +33 -0
- package/dist/utils/lodash.js +123 -0
- package/dist/utils/lodash.js.map +1 -0
- package/dist/utils/presentation.d.ts +19 -0
- package/dist/utils/presentation.js +25 -0
- package/dist/utils/presentation.js.map +1 -0
- package/dist/utils/promise.d.ts +6 -0
- package/dist/utils/promise.js +17 -0
- package/dist/utils/promise.js.map +1 -0
- package/dist/utils/protocol.d.ts +110 -0
- package/dist/utils/protocol.js +59 -0
- package/dist/utils/protocol.js.map +1 -0
- package/dist/utils/types.d.ts +23 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +187 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { throttle } from '../utils/lodash.js';
|
|
2
|
+
import { ClientEvents, Environment } from '../utils/index.js';
|
|
3
|
+
const ACTIVITY_EVENTS = [
|
|
4
|
+
'focus',
|
|
5
|
+
'mousemove',
|
|
6
|
+
'mousedown',
|
|
7
|
+
'keydown',
|
|
8
|
+
'scroll',
|
|
9
|
+
'touchstart',
|
|
10
|
+
'pageshow',
|
|
11
|
+
'pagehide',
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Disconnects the client after a period of inactivity.
|
|
15
|
+
* Only instantiated when `idlenessTimeout` is configured.
|
|
16
|
+
*
|
|
17
|
+
* Extracted from the former IdleTimeout class to isolate idle-disconnect
|
|
18
|
+
* logic from visibility-based reconnection (now in VisibilityManager).
|
|
19
|
+
*/
|
|
20
|
+
export class IdleTimer {
|
|
21
|
+
client;
|
|
22
|
+
timeout;
|
|
23
|
+
timerId = null;
|
|
24
|
+
resetHandler = null;
|
|
25
|
+
constructor(client, timeout) {
|
|
26
|
+
this.client = client;
|
|
27
|
+
this.timeout = timeout;
|
|
28
|
+
this.setup();
|
|
29
|
+
}
|
|
30
|
+
/** Starts the idle countdown. Fires `client.close()` when it expires. */
|
|
31
|
+
start() {
|
|
32
|
+
if (typeof this.timeout !== 'number')
|
|
33
|
+
return;
|
|
34
|
+
if (!Environment.isBrowser && !Environment.isTest)
|
|
35
|
+
return;
|
|
36
|
+
this.timerId = setTimeout(() => {
|
|
37
|
+
this.client.close();
|
|
38
|
+
if (this.client.options?.debug) {
|
|
39
|
+
console.log('TypeFerry: Disconnected due to inactivity');
|
|
40
|
+
}
|
|
41
|
+
}, this.timeout);
|
|
42
|
+
}
|
|
43
|
+
/** Clears the current idle countdown. */
|
|
44
|
+
stop() {
|
|
45
|
+
if (this.timerId) {
|
|
46
|
+
clearTimeout(this.timerId);
|
|
47
|
+
this.timerId = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resets the idle timer and reconnects if the socket is disconnected.
|
|
52
|
+
* Called on user activity (mousemove, keydown, etc.).
|
|
53
|
+
*
|
|
54
|
+
* Only reconnects if the socket is actually down — does NOT force
|
|
55
|
+
* reconnection when initialized=false, which would create loops.
|
|
56
|
+
*/
|
|
57
|
+
/**
|
|
58
|
+
* Resets the idle timer and reconnects if the socket is disconnected.
|
|
59
|
+
* Defers restarting the idle countdown until after the connection is
|
|
60
|
+
* established to prevent the timer from firing mid-reconnect.
|
|
61
|
+
*/
|
|
62
|
+
async reset() {
|
|
63
|
+
this.stop();
|
|
64
|
+
const socket = this.client.clientSocket.socket;
|
|
65
|
+
if (socket?.readyState === WebSocket.OPEN) {
|
|
66
|
+
this.start();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.client.clientSocket.connect();
|
|
70
|
+
await this.client.waitFor(ClientEvents.WEBSOCKET_CONNECTED, 10000);
|
|
71
|
+
this.start();
|
|
72
|
+
}
|
|
73
|
+
/** Removes all event listeners and cleans up resources. */
|
|
74
|
+
destroy() {
|
|
75
|
+
this.stop();
|
|
76
|
+
if (this.resetHandler) {
|
|
77
|
+
this.resetHandler.cancel();
|
|
78
|
+
}
|
|
79
|
+
if (typeof window !== 'undefined' && this.resetHandler) {
|
|
80
|
+
for (const event of ACTIVITY_EVENTS) {
|
|
81
|
+
window.removeEventListener(event, this.resetHandler);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
this.resetHandler = null;
|
|
85
|
+
}
|
|
86
|
+
setup() {
|
|
87
|
+
this.client.on(ClientEvents.CLOSE, () => this.stop());
|
|
88
|
+
// Defer the first start so the constructor completes first
|
|
89
|
+
setTimeout(() => this.start(), 0);
|
|
90
|
+
if (typeof window === 'undefined')
|
|
91
|
+
return;
|
|
92
|
+
this.resetHandler = throttle(this.reset.bind(this), this.timeout / 2, {
|
|
93
|
+
leading: true,
|
|
94
|
+
trailing: true,
|
|
95
|
+
});
|
|
96
|
+
for (const event of ACTIVITY_EVENTS) {
|
|
97
|
+
window.addEventListener(event, this.resetHandler);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=idle-timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle-timer.js","sourceRoot":"","sources":["../../src/client/idle-timer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,UAAU,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized logging for TypeFerry client.
|
|
3
|
+
* Provides structured logging with categories and levels for easier debugging.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum LogLevel {
|
|
6
|
+
DEBUG = 0,
|
|
7
|
+
INFO = 1,
|
|
8
|
+
WARN = 2,
|
|
9
|
+
ERROR = 3,
|
|
10
|
+
SILENT = 4
|
|
11
|
+
}
|
|
12
|
+
export declare enum LogCategory {
|
|
13
|
+
CONNECTION = "connection",
|
|
14
|
+
AUTH = "auth",
|
|
15
|
+
METHOD = "method",
|
|
16
|
+
SUBSCRIPTION = "subscription",
|
|
17
|
+
CHANNEL = "channel"
|
|
18
|
+
}
|
|
19
|
+
export interface LogEntry {
|
|
20
|
+
level: LogLevel;
|
|
21
|
+
category: LogCategory;
|
|
22
|
+
message: string;
|
|
23
|
+
context?: Record<string, unknown>;
|
|
24
|
+
error?: Error;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
}
|
|
27
|
+
export type LogListener = (entry: LogEntry) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Logger for TypeFerry client with structured logging support.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const logger = new TypeFerryLogger()
|
|
34
|
+
* logger.setLevel(LogLevel.DEBUG)
|
|
35
|
+
*
|
|
36
|
+
* // Subscribe to all logs
|
|
37
|
+
* const unsubscribe = logger.onLog(entry => {
|
|
38
|
+
* // Send to external service
|
|
39
|
+
* })
|
|
40
|
+
*
|
|
41
|
+
* // Log with context
|
|
42
|
+
* logger.method(LogLevel.ERROR, 'Method call failed', {
|
|
43
|
+
* method: 'boards.get',
|
|
44
|
+
* timeout: 30000,
|
|
45
|
+
* })
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class TypeFerryLogger {
|
|
49
|
+
private level;
|
|
50
|
+
private listeners;
|
|
51
|
+
/**
|
|
52
|
+
* Set the minimum log level. Messages below this level are ignored.
|
|
53
|
+
*/
|
|
54
|
+
setLevel(level: LogLevel): void;
|
|
55
|
+
/**
|
|
56
|
+
* Get the current log level.
|
|
57
|
+
*/
|
|
58
|
+
getLevel(): LogLevel;
|
|
59
|
+
/**
|
|
60
|
+
* Subscribe to log entries.
|
|
61
|
+
* Returns an unsubscribe function.
|
|
62
|
+
*/
|
|
63
|
+
onLog(listener: LogListener): () => void;
|
|
64
|
+
/**
|
|
65
|
+
* Core logging method.
|
|
66
|
+
*/
|
|
67
|
+
log(entry: Omit<LogEntry, 'timestamp'>): void;
|
|
68
|
+
private output;
|
|
69
|
+
connection(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
|
|
70
|
+
auth(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
|
|
71
|
+
method(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
|
|
72
|
+
subscription(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
|
|
73
|
+
channel(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void;
|
|
74
|
+
}
|
|
75
|
+
/** Shared logger instance for the TypeFerry client. */
|
|
76
|
+
export declare const logger: TypeFerryLogger;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized logging for TypeFerry client.
|
|
3
|
+
* Provides structured logging with categories and levels for easier debugging.
|
|
4
|
+
*/
|
|
5
|
+
export var LogLevel;
|
|
6
|
+
(function (LogLevel) {
|
|
7
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
8
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
9
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
10
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
11
|
+
LogLevel[LogLevel["SILENT"] = 4] = "SILENT";
|
|
12
|
+
})(LogLevel || (LogLevel = {}));
|
|
13
|
+
export var LogCategory;
|
|
14
|
+
(function (LogCategory) {
|
|
15
|
+
LogCategory["CONNECTION"] = "connection";
|
|
16
|
+
LogCategory["AUTH"] = "auth";
|
|
17
|
+
LogCategory["METHOD"] = "method";
|
|
18
|
+
LogCategory["SUBSCRIPTION"] = "subscription";
|
|
19
|
+
LogCategory["CHANNEL"] = "channel";
|
|
20
|
+
})(LogCategory || (LogCategory = {}));
|
|
21
|
+
/**
|
|
22
|
+
* Logger for TypeFerry client with structured logging support.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const logger = new TypeFerryLogger()
|
|
27
|
+
* logger.setLevel(LogLevel.DEBUG)
|
|
28
|
+
*
|
|
29
|
+
* // Subscribe to all logs
|
|
30
|
+
* const unsubscribe = logger.onLog(entry => {
|
|
31
|
+
* // Send to external service
|
|
32
|
+
* })
|
|
33
|
+
*
|
|
34
|
+
* // Log with context
|
|
35
|
+
* logger.method(LogLevel.ERROR, 'Method call failed', {
|
|
36
|
+
* method: 'boards.get',
|
|
37
|
+
* timeout: 30000,
|
|
38
|
+
* })
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export class TypeFerryLogger {
|
|
42
|
+
level = LogLevel.WARN;
|
|
43
|
+
listeners = new Set();
|
|
44
|
+
/**
|
|
45
|
+
* Set the minimum log level. Messages below this level are ignored.
|
|
46
|
+
*/
|
|
47
|
+
setLevel(level) {
|
|
48
|
+
this.level = level;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the current log level.
|
|
52
|
+
*/
|
|
53
|
+
getLevel() {
|
|
54
|
+
return this.level;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Subscribe to log entries.
|
|
58
|
+
* Returns an unsubscribe function.
|
|
59
|
+
*/
|
|
60
|
+
onLog(listener) {
|
|
61
|
+
this.listeners.add(listener);
|
|
62
|
+
return () => {
|
|
63
|
+
this.listeners.delete(listener);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Core logging method.
|
|
68
|
+
*/
|
|
69
|
+
log(entry) {
|
|
70
|
+
if (entry.level < this.level)
|
|
71
|
+
return;
|
|
72
|
+
const fullEntry = { ...entry, timestamp: Date.now() };
|
|
73
|
+
this.output(fullEntry);
|
|
74
|
+
this.listeners.forEach(listener => listener(fullEntry));
|
|
75
|
+
}
|
|
76
|
+
output(entry) {
|
|
77
|
+
const prefix = `[TypeFerry:${entry.category}]`;
|
|
78
|
+
const args = [prefix, entry.message];
|
|
79
|
+
if (entry.context)
|
|
80
|
+
args.push(entry.context);
|
|
81
|
+
if (entry.error)
|
|
82
|
+
args.push(entry.error);
|
|
83
|
+
switch (entry.level) {
|
|
84
|
+
case LogLevel.DEBUG:
|
|
85
|
+
console.debug(...args);
|
|
86
|
+
break;
|
|
87
|
+
case LogLevel.INFO:
|
|
88
|
+
console.log(...args);
|
|
89
|
+
break;
|
|
90
|
+
case LogLevel.WARN:
|
|
91
|
+
console.warn(...args);
|
|
92
|
+
break;
|
|
93
|
+
case LogLevel.ERROR:
|
|
94
|
+
console.error(...args);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Category-specific convenience methods
|
|
99
|
+
connection(level, message, context, error) {
|
|
100
|
+
this.log({
|
|
101
|
+
level,
|
|
102
|
+
category: LogCategory.CONNECTION,
|
|
103
|
+
message,
|
|
104
|
+
context,
|
|
105
|
+
error,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
auth(level, message, context, error) {
|
|
109
|
+
this.log({ level, category: LogCategory.AUTH, message, context, error });
|
|
110
|
+
}
|
|
111
|
+
method(level, message, context, error) {
|
|
112
|
+
this.log({ level, category: LogCategory.METHOD, message, context, error });
|
|
113
|
+
}
|
|
114
|
+
subscription(level, message, context, error) {
|
|
115
|
+
this.log({
|
|
116
|
+
level,
|
|
117
|
+
category: LogCategory.SUBSCRIPTION,
|
|
118
|
+
message,
|
|
119
|
+
context,
|
|
120
|
+
error,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
channel(level, message, context, error) {
|
|
124
|
+
this.log({ level, category: LogCategory.CHANNEL, message, context, error });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Shared logger instance for the TypeFerry client. */
|
|
128
|
+
export const logger = new TypeFerryLogger();
|
|
129
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/client/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Client } from './client.js';
|
|
2
|
+
import type { IdleTimer } from './idle-timer.js';
|
|
3
|
+
/**
|
|
4
|
+
* Handles tab visibility changes and reconnects after browser/OS sleep.
|
|
5
|
+
* Always instantiated — visibility recovery is always active regardless
|
|
6
|
+
* of whether idle timeout is configured.
|
|
7
|
+
*
|
|
8
|
+
* Uses both `visibilitychange` events and a setInterval heartbeat to
|
|
9
|
+
* detect sleep. macOS may not fire `visibilitychange` before idle-triggered
|
|
10
|
+
* sleep, so the heartbeat catches gaps the event misses.
|
|
11
|
+
*/
|
|
12
|
+
export declare class VisibilityManager {
|
|
13
|
+
private client;
|
|
14
|
+
private idleTimer;
|
|
15
|
+
/**
|
|
16
|
+
* Optional async hook called before reconnecting after tab visibility restore.
|
|
17
|
+
* Used by the auth system to proactively refresh expired access tokens so the
|
|
18
|
+
* socket reconnects with a valid token instead of failing auth first.
|
|
19
|
+
*/
|
|
20
|
+
onBeforeReconnect: (() => Promise<void>) | null;
|
|
21
|
+
private visibilityHandler;
|
|
22
|
+
private hiddenAt;
|
|
23
|
+
private heartbeatTimer;
|
|
24
|
+
private lastHeartbeat;
|
|
25
|
+
/**
|
|
26
|
+
* Guards against duplicate reconnects when both the heartbeat and
|
|
27
|
+
* visibilitychange fire in quick succession after wake.
|
|
28
|
+
*/
|
|
29
|
+
private reconnecting;
|
|
30
|
+
constructor(client: Client, idleTimer: IdleTimer | null);
|
|
31
|
+
/**
|
|
32
|
+
* Tears down the existing socket and creates a fresh connection.
|
|
33
|
+
* After tab sleep, the socket may be in a stale state — so we always
|
|
34
|
+
* do a full cleanup before reconnecting.
|
|
35
|
+
*/
|
|
36
|
+
reconnect(): void;
|
|
37
|
+
/** Removes all listeners and timers to prevent memory leaks. */
|
|
38
|
+
destroy(): void;
|
|
39
|
+
private setup;
|
|
40
|
+
private startHeartbeat;
|
|
41
|
+
private stopHeartbeat;
|
|
42
|
+
private handlePageHide;
|
|
43
|
+
/**
|
|
44
|
+
* Unified entry point for sleep detection from both the heartbeat
|
|
45
|
+
* timer and `visibilitychange`. Uses `reconnecting` to prevent
|
|
46
|
+
* duplicate reconnects when both fire after wake.
|
|
47
|
+
*/
|
|
48
|
+
private handleSleepDetected;
|
|
49
|
+
/**
|
|
50
|
+
* Runs the pre-reconnect hook with bounded retries (WiFi may take
|
|
51
|
+
* seconds to reconnect after wake), then reconnects. Falls back to
|
|
52
|
+
* reconnecting even if all retry attempts fail.
|
|
53
|
+
*/
|
|
54
|
+
private runHookAndReconnect;
|
|
55
|
+
/**
|
|
56
|
+
* Determines whether reconnection is needed and triggers it. Routes
|
|
57
|
+
* through `handleSleepDetected` for deduplication with the heartbeat.
|
|
58
|
+
*/
|
|
59
|
+
private handlePageVisible;
|
|
60
|
+
/** Promisified delay for hook retry backoff. */
|
|
61
|
+
private delay;
|
|
62
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { ClientEvents } from '../utils/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Time threshold below which we trust the socket connection is healthy.
|
|
4
|
+
* If hidden for less than this, we only reconnect if the socket is actually
|
|
5
|
+
* disconnected.
|
|
6
|
+
*/
|
|
7
|
+
const FORCE_RECONNECT_THRESHOLD = 60 * 60 * 1000; // 1 hour
|
|
8
|
+
/** Heartbeat fires every 30s to detect OS sleep gaps. */
|
|
9
|
+
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
10
|
+
/** If the gap between heartbeats exceeds 2x the interval, we were sleeping. */
|
|
11
|
+
const HEARTBEAT_THRESHOLD_MS = 60_000;
|
|
12
|
+
/** Max retry attempts for the pre-reconnect hook (network may not be ready on wake). */
|
|
13
|
+
const HOOK_RETRY_ATTEMPTS = 3;
|
|
14
|
+
/** Delay between hook retry attempts in ms. */
|
|
15
|
+
const HOOK_RETRY_DELAY_MS = 2_000;
|
|
16
|
+
/**
|
|
17
|
+
* Handles tab visibility changes and reconnects after browser/OS sleep.
|
|
18
|
+
* Always instantiated — visibility recovery is always active regardless
|
|
19
|
+
* of whether idle timeout is configured.
|
|
20
|
+
*
|
|
21
|
+
* Uses both `visibilitychange` events and a setInterval heartbeat to
|
|
22
|
+
* detect sleep. macOS may not fire `visibilitychange` before idle-triggered
|
|
23
|
+
* sleep, so the heartbeat catches gaps the event misses.
|
|
24
|
+
*/
|
|
25
|
+
export class VisibilityManager {
|
|
26
|
+
client;
|
|
27
|
+
idleTimer;
|
|
28
|
+
/**
|
|
29
|
+
* Optional async hook called before reconnecting after tab visibility restore.
|
|
30
|
+
* Used by the auth system to proactively refresh expired access tokens so the
|
|
31
|
+
* socket reconnects with a valid token instead of failing auth first.
|
|
32
|
+
*/
|
|
33
|
+
onBeforeReconnect = null;
|
|
34
|
+
visibilityHandler = null;
|
|
35
|
+
hiddenAt = null;
|
|
36
|
+
heartbeatTimer = null;
|
|
37
|
+
lastHeartbeat = Date.now();
|
|
38
|
+
/**
|
|
39
|
+
* Guards against duplicate reconnects when both the heartbeat and
|
|
40
|
+
* visibilitychange fire in quick succession after wake.
|
|
41
|
+
*/
|
|
42
|
+
reconnecting = false;
|
|
43
|
+
constructor(client, idleTimer) {
|
|
44
|
+
this.client = client;
|
|
45
|
+
this.idleTimer = idleTimer;
|
|
46
|
+
this.setup();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Tears down the existing socket and creates a fresh connection.
|
|
50
|
+
* After tab sleep, the socket may be in a stale state — so we always
|
|
51
|
+
* do a full cleanup before reconnecting.
|
|
52
|
+
*/
|
|
53
|
+
reconnect() {
|
|
54
|
+
const wasInitialized = this.client.initialized;
|
|
55
|
+
this.client.initialized = false;
|
|
56
|
+
this.client.initializing = false;
|
|
57
|
+
const existingSocket = this.client.clientSocket.socket;
|
|
58
|
+
if (existingSocket) {
|
|
59
|
+
existingSocket.close();
|
|
60
|
+
this.client.clientSocket.socket = undefined;
|
|
61
|
+
}
|
|
62
|
+
this.client.clientSocket.connect();
|
|
63
|
+
this.lastHeartbeat = Date.now();
|
|
64
|
+
this.reconnecting = false;
|
|
65
|
+
if (wasInitialized) {
|
|
66
|
+
this.client.emit(ClientEvents.WEBSOCKET_RECONNECTING);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Removes all listeners and timers to prevent memory leaks. */
|
|
70
|
+
destroy() {
|
|
71
|
+
if (typeof document !== 'undefined' && this.visibilityHandler) {
|
|
72
|
+
document.removeEventListener('visibilitychange', this.visibilityHandler);
|
|
73
|
+
}
|
|
74
|
+
this.visibilityHandler = null;
|
|
75
|
+
this.stopHeartbeat();
|
|
76
|
+
}
|
|
77
|
+
setup() {
|
|
78
|
+
if (typeof window === 'undefined')
|
|
79
|
+
return;
|
|
80
|
+
this.visibilityHandler = () => {
|
|
81
|
+
if (document.visibilityState === 'hidden') {
|
|
82
|
+
this.hiddenAt = Date.now();
|
|
83
|
+
this.handlePageHide();
|
|
84
|
+
}
|
|
85
|
+
else if (document.visibilityState === 'visible') {
|
|
86
|
+
this.handlePageVisible();
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
document.addEventListener('visibilitychange', this.visibilityHandler);
|
|
90
|
+
this.startHeartbeat();
|
|
91
|
+
}
|
|
92
|
+
startHeartbeat() {
|
|
93
|
+
this.lastHeartbeat = Date.now();
|
|
94
|
+
this.heartbeatTimer = setInterval(() => {
|
|
95
|
+
const now = Date.now();
|
|
96
|
+
const gap = now - this.lastHeartbeat;
|
|
97
|
+
this.lastHeartbeat = now;
|
|
98
|
+
if (gap > HEARTBEAT_THRESHOLD_MS) {
|
|
99
|
+
this.handleSleepDetected('heartbeat', gap);
|
|
100
|
+
}
|
|
101
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
102
|
+
}
|
|
103
|
+
stopHeartbeat() {
|
|
104
|
+
if (this.heartbeatTimer) {
|
|
105
|
+
clearInterval(this.heartbeatTimer);
|
|
106
|
+
this.heartbeatTimer = null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
handlePageHide() {
|
|
110
|
+
if (this.client.options?.ws?.disconnectOnPageHide) {
|
|
111
|
+
this.client.close();
|
|
112
|
+
if (this.client.options?.debug) {
|
|
113
|
+
console.log('TypeFerry: Disconnected on page hide');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Unified entry point for sleep detection from both the heartbeat
|
|
119
|
+
* timer and `visibilitychange`. Uses `reconnecting` to prevent
|
|
120
|
+
* duplicate reconnects when both fire after wake.
|
|
121
|
+
*/
|
|
122
|
+
handleSleepDetected(source, durationMs) {
|
|
123
|
+
if (this.reconnecting)
|
|
124
|
+
return;
|
|
125
|
+
this.reconnecting = true;
|
|
126
|
+
if (this.client.options?.debug) {
|
|
127
|
+
console.log(`TypeFerry: Sleep detected via ${source} (${Math.round(durationMs / 1000)}s gap), reconnecting`);
|
|
128
|
+
}
|
|
129
|
+
this.runHookAndReconnect();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Runs the pre-reconnect hook with bounded retries (WiFi may take
|
|
133
|
+
* seconds to reconnect after wake), then reconnects. Falls back to
|
|
134
|
+
* reconnecting even if all retry attempts fail.
|
|
135
|
+
*/
|
|
136
|
+
async runHookAndReconnect() {
|
|
137
|
+
if (this.onBeforeReconnect) {
|
|
138
|
+
for (let attempt = 0; attempt < HOOK_RETRY_ATTEMPTS; attempt++) {
|
|
139
|
+
try {
|
|
140
|
+
await this.onBeforeReconnect();
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
const isLastAttempt = attempt === HOOK_RETRY_ATTEMPTS - 1;
|
|
145
|
+
if (!isLastAttempt) {
|
|
146
|
+
await this.delay(HOOK_RETRY_DELAY_MS);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
this.reconnect();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Determines whether reconnection is needed and triggers it. Routes
|
|
155
|
+
* through `handleSleepDetected` for deduplication with the heartbeat.
|
|
156
|
+
*/
|
|
157
|
+
handlePageVisible() {
|
|
158
|
+
const hiddenDuration = this.hiddenAt ? Date.now() - this.hiddenAt : 0;
|
|
159
|
+
this.hiddenAt = null;
|
|
160
|
+
const socket = this.client.clientSocket.socket;
|
|
161
|
+
const isConnected = socket?.readyState === WebSocket.OPEN && this.client.initialized;
|
|
162
|
+
const needsReconnect = !isConnected || hiddenDuration > FORCE_RECONNECT_THRESHOLD;
|
|
163
|
+
if (needsReconnect) {
|
|
164
|
+
this.handleSleepDetected('visibility', hiddenDuration);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (this.idleTimer) {
|
|
168
|
+
this.idleTimer.stop();
|
|
169
|
+
this.idleTimer.start();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Promisified delay for hook retry backoff. */
|
|
173
|
+
delay(ms) {
|
|
174
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=visibility-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visibility-manager.js","sourceRoot":"","sources":["../../src/client/visibility-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const adjustTypesFromJSONValue: (obj: any) => any;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* for both arrays and objects. Tries its best to just
|
|
3
|
+
* use the object you hand it, but may return something
|
|
4
|
+
* different if the object you hand it itself needs changing.
|
|
5
|
+
*/
|
|
6
|
+
import { fromJSONValueHelper } from './helpers/from-json-value-helper.js';
|
|
7
|
+
import { isObject, keysOf } from './utils.js';
|
|
8
|
+
export const adjustTypesFromJSONValue = obj => {
|
|
9
|
+
if (obj === null) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const maybeChanged = fromJSONValueHelper(obj);
|
|
13
|
+
if (maybeChanged !== obj) {
|
|
14
|
+
return maybeChanged;
|
|
15
|
+
}
|
|
16
|
+
// Other atoms are unchanged.
|
|
17
|
+
if (!isObject(obj)) {
|
|
18
|
+
return obj;
|
|
19
|
+
}
|
|
20
|
+
keysOf(obj).forEach(key => {
|
|
21
|
+
const value = obj[key];
|
|
22
|
+
if (isObject(value)) {
|
|
23
|
+
const changed = fromJSONValueHelper(value);
|
|
24
|
+
if (value !== changed) {
|
|
25
|
+
obj[key] = changed;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// if we get here, value is an object but not adjustable
|
|
29
|
+
// at this level. recurse.
|
|
30
|
+
adjustTypesFromJSONValue(value);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return obj;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=adjust-types-from-json-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adjust-types-from-json-value.js","sourceRoot":"","sources":["../../src/ejson/adjust-types-from-json-value.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAE1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC,EAAE;IAC5C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IAC7C,IAAI,YAAY,KAAK,GAAG,EAAE,CAAC;QACzB,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;YAC1C,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;gBAClB,OAAM;YACR,CAAC;YACD,wDAAwD;YACxD,2BAA2B;YAC3B,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { newBinary } from './utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Encodes binary payloads for EJSON without relying on a CJS-only dependency
|
|
4
|
+
* that breaks browser ESM loading in source-first consumers.
|
|
5
|
+
*/
|
|
6
|
+
export declare function encodeBase64(bytes: Uint8Array): string;
|
|
7
|
+
/**
|
|
8
|
+
* Decodes EJSON base64 payloads while preserving the legacy polyfill
|
|
9
|
+
* behavior for runtimes without `Uint8Array`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function decodeBase64(value: string): Uint8Array | ReturnType<typeof newBinary>;
|