doover-js 0.11.0 → 0.13.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 +106 -0
- package/dist/apis/_args.js +5 -5
- package/dist/apis/agents-api.d.ts +4 -4
- package/dist/apis/agents-api.js +2 -2
- package/dist/apis/aggregates-api.d.ts +4 -4
- package/dist/apis/aggregates-api.js +5 -5
- package/dist/apis/alarms-api.d.ts +2 -2
- package/dist/apis/alarms-api.js +3 -3
- package/dist/apis/channels-api.d.ts +3 -3
- package/dist/apis/channels-api.js +6 -6
- package/dist/apis/connections-api.d.ts +2 -2
- package/dist/apis/connections-api.js +6 -6
- package/dist/apis/messages-api.d.ts +4 -4
- package/dist/apis/messages-api.js +11 -11
- package/dist/apis/notifications-api.d.ts +2 -2
- package/dist/apis/notifications-api.js +4 -4
- package/dist/apis/organisations-api.d.ts +2 -2
- package/dist/apis/permissions-api.d.ts +2 -2
- package/dist/apis/permissions-api.js +3 -3
- package/dist/apis/processors-api.d.ts +2 -2
- package/dist/apis/turn-api.d.ts +2 -2
- package/dist/apis/users-api.d.ts +2 -2
- package/dist/auth/auth-store.d.ts +1 -1
- package/dist/auth/build-auth.d.ts +3 -3
- package/dist/auth/build-auth.js +8 -8
- package/dist/auth/cookie-auth.d.ts +1 -1
- package/dist/auth/cookie-auth.js +2 -2
- package/dist/auth/doover-auth.d.ts +2 -2
- package/dist/auth/doover-token-auth.d.ts +3 -3
- package/dist/auth/doover-token-auth.js +13 -13
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.js +15 -0
- package/dist/client/data-client.d.ts +17 -14
- package/dist/client/doover-client.d.ts +9 -7
- package/dist/client/doover-client.js +44 -42
- package/dist/client/errors.d.ts +2 -2
- package/dist/client/errors.js +4 -4
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +12 -0
- package/dist/client/local-agent-client.d.ts +3 -3
- package/dist/client/local-agent-client.js +19 -19
- package/dist/client/multiplex-client.d.ts +5 -5
- package/dist/client/multiplex-client.js +25 -25
- package/dist/client/multiplex-gateway.d.ts +3 -3
- package/dist/client/multiplex-merge.d.ts +1 -1
- package/dist/client/network-status.d.ts +17 -0
- package/dist/client/network-status.js +70 -0
- package/dist/client/offline-cache.d.ts +9 -4
- package/dist/client/offline-cache.js +34 -22
- package/dist/client/provenance.d.ts +1 -1
- package/dist/client/request-options.d.ts +1 -1
- package/dist/client/singleton.d.ts +2 -2
- package/dist/client/singleton.js +2 -2
- package/dist/client/status-tracker.d.ts +1 -1
- package/dist/esm/apis/_args.d.ts +16 -0
- package/dist/esm/apis/_args.js +27 -0
- package/dist/esm/apis/agents-api.d.ts +196 -0
- package/dist/esm/apis/agents-api.js +327 -0
- package/dist/esm/apis/aggregates-api.d.ts +67 -0
- package/dist/esm/apis/aggregates-api.js +64 -0
- package/dist/esm/apis/alarms-api.d.ts +48 -0
- package/dist/esm/apis/alarms-api.js +75 -0
- package/dist/esm/apis/channels-api.d.ts +83 -0
- package/dist/esm/apis/channels-api.js +65 -0
- package/dist/esm/apis/connections-api.d.ts +45 -0
- package/dist/esm/apis/connections-api.js +44 -0
- package/dist/esm/apis/messages-api.d.ts +128 -0
- package/dist/esm/apis/messages-api.js +179 -0
- package/dist/esm/apis/notifications-api.d.ts +94 -0
- package/dist/esm/apis/notifications-api.js +153 -0
- package/dist/esm/apis/organisations-api.d.ts +26 -0
- package/dist/esm/apis/organisations-api.js +41 -0
- package/dist/esm/apis/permissions-api.d.ts +17 -0
- package/dist/esm/apis/permissions-api.js +23 -0
- package/dist/esm/apis/processors-api.d.ts +56 -0
- package/dist/esm/apis/processors-api.js +97 -0
- package/dist/esm/apis/turn-api.d.ts +7 -0
- package/dist/esm/apis/turn-api.js +8 -0
- package/dist/esm/apis/users-api.d.ts +8 -0
- package/dist/esm/apis/users-api.js +9 -0
- package/dist/esm/auth/auth-profile.d.ts +45 -0
- package/dist/esm/auth/auth-profile.js +68 -0
- package/dist/esm/auth/auth-store.d.ts +14 -0
- package/dist/esm/auth/build-auth.d.ts +38 -0
- package/dist/esm/auth/build-auth.js +92 -0
- package/dist/esm/auth/cookie-auth.d.ts +91 -0
- package/dist/esm/auth/cookie-auth.js +196 -0
- package/dist/esm/auth/doover-auth.d.ts +52 -0
- package/dist/esm/auth/doover-auth.js +28 -0
- package/dist/esm/auth/doover-token-auth.d.ts +39 -0
- package/dist/esm/auth/doover-token-auth.js +217 -0
- package/dist/esm/auth/errors.d.ts +3 -0
- package/dist/esm/auth/errors.js +6 -0
- package/dist/esm/auth/index.d.ts +10 -0
- package/dist/esm/auth/index.js +6 -0
- package/dist/esm/auth/jwt.d.ts +6 -0
- package/dist/esm/auth/jwt.js +26 -0
- package/dist/esm/client/capabilities.d.ts +10 -0
- package/dist/esm/client/capabilities.js +42 -0
- package/dist/esm/client/data-client.d.ts +107 -0
- package/dist/esm/client/doover-client.d.ts +48 -0
- package/dist/esm/client/doover-client.js +96 -0
- package/dist/esm/client/errors.d.ts +32 -0
- package/dist/esm/client/errors.js +64 -0
- package/dist/esm/client/index.d.ts +6 -0
- package/dist/esm/client/index.js +3 -0
- package/dist/esm/client/local-agent-client.d.ts +65 -0
- package/dist/esm/client/local-agent-client.js +225 -0
- package/dist/esm/client/multiplex-client.d.ts +165 -0
- package/dist/esm/client/multiplex-client.js +842 -0
- package/dist/esm/client/multiplex-gateway.d.ts +49 -0
- package/dist/esm/client/multiplex-gateway.js +110 -0
- package/dist/esm/client/multiplex-merge.d.ts +12 -0
- package/dist/esm/client/multiplex-merge.js +38 -0
- package/dist/esm/client/network-status.d.ts +17 -0
- package/dist/esm/client/network-status.js +66 -0
- package/dist/esm/client/offline-cache.d.ts +167 -0
- package/dist/esm/client/offline-cache.js +769 -0
- package/dist/esm/client/provenance.d.ts +60 -0
- package/dist/esm/client/provenance.js +108 -0
- package/dist/esm/client/request-options.d.ts +23 -0
- package/dist/esm/client/request-options.js +23 -0
- package/dist/esm/client/singleton.d.ts +26 -0
- package/dist/esm/client/singleton.js +54 -0
- package/dist/esm/client/stats.d.ts +79 -0
- package/dist/esm/client/stats.js +155 -0
- package/dist/esm/client/status-tracker.d.ts +24 -0
- package/dist/esm/client/status-tracker.js +86 -0
- package/dist/esm/gateway/gateway-client.d.ts +86 -0
- package/dist/esm/gateway/gateway-client.js +463 -0
- package/dist/esm/gateway/index.d.ts +3 -0
- package/dist/esm/gateway/index.js +1 -0
- package/dist/esm/gateway/types.d.ts +142 -0
- package/dist/esm/http/errors.d.ts +19 -0
- package/dist/esm/http/errors.js +22 -0
- package/dist/esm/http/index.d.ts +3 -0
- package/dist/esm/http/index.js +2 -0
- package/dist/esm/http/rest-client.d.ts +64 -0
- package/dist/esm/http/rest-client.js +181 -0
- package/dist/esm/index.d.ts +64 -0
- package/dist/esm/index.js +38 -0
- package/dist/esm/node/config-manager.d.ts +34 -0
- package/dist/esm/node/config-manager.js +140 -0
- package/dist/esm/node/index.d.ts +1 -0
- package/dist/esm/node/index.js +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/react/context.d.ts +23 -0
- package/dist/esm/react/context.js +28 -0
- package/dist/esm/react/index.d.ts +38 -0
- package/dist/esm/react/index.js +21 -0
- package/dist/esm/react/messageRangeStore.d.ts +93 -0
- package/dist/esm/react/messageRangeStore.js +140 -0
- package/dist/esm/react/sharedQueryClient.d.ts +21 -0
- package/dist/esm/react/sharedQueryClient.js +35 -0
- package/dist/esm/react/useAgentChannel.d.ts +8 -0
- package/dist/esm/react/useAgentChannel.js +9 -0
- package/dist/esm/react/useAgentConnections.d.ts +8 -0
- package/dist/esm/react/useAgentConnections.js +20 -0
- package/dist/esm/react/useAgentTokenState.d.ts +70 -0
- package/dist/esm/react/useAgentTokenState.js +127 -0
- package/dist/esm/react/useChannelAggregate.d.ts +64 -0
- package/dist/esm/react/useChannelAggregate.js +77 -0
- package/dist/esm/react/useChannelMessage.d.ts +45 -0
- package/dist/esm/react/useChannelMessage.js +79 -0
- package/dist/esm/react/useChannelMessages.d.ts +83 -0
- package/dist/esm/react/useChannelMessages.js +214 -0
- package/dist/esm/react/useChannelSubscription.d.ts +27 -0
- package/dist/esm/react/useChannelSubscription.js +30 -0
- package/dist/esm/react/useClientStatus.d.ts +10 -0
- package/dist/esm/react/useClientStatus.js +19 -0
- package/dist/esm/react/useConnectionState.d.ts +26 -0
- package/dist/esm/react/useConnectionState.js +45 -0
- package/dist/esm/react/useDeviceMap.d.ts +109 -0
- package/dist/esm/react/useDeviceMap.js +59 -0
- package/dist/esm/react/useInvocationLogs.d.ts +23 -0
- package/dist/esm/react/useInvocationLogs.js +37 -0
- package/dist/esm/react/useMultiAgentAggregates.d.ts +38 -0
- package/dist/esm/react/useMultiAgentAggregates.js +104 -0
- package/dist/esm/react/useMultiAgentChannelMessages.d.ts +79 -0
- package/dist/esm/react/useMultiAgentChannelMessages.js +169 -0
- package/dist/esm/react/useOfflineStatus.d.ts +8 -0
- package/dist/esm/react/useOfflineStatus.js +37 -0
- package/dist/esm/react/useSendMessage.d.ts +16 -0
- package/dist/esm/react/useSendMessage.js +26 -0
- package/dist/esm/react/useSendRpc.d.ts +68 -0
- package/dist/esm/react/useSendRpc.js +164 -0
- package/dist/esm/react/useTurnCredentials.d.ts +12 -0
- package/dist/esm/react/useTurnCredentials.js +22 -0
- package/dist/esm/react/useUpdateAggregate.d.ts +27 -0
- package/dist/esm/react/useUpdateAggregate.js +39 -0
- package/dist/esm/react/useUpdateMessage.d.ts +38 -0
- package/dist/esm/react/useUpdateMessage.js +36 -0
- package/dist/esm/refine/index.d.ts +72 -0
- package/dist/esm/refine/index.js +215 -0
- package/dist/esm/rpc/errors.d.ts +10 -0
- package/dist/esm/rpc/errors.js +19 -0
- package/dist/esm/rpc/index.d.ts +3 -0
- package/dist/esm/rpc/index.js +2 -0
- package/dist/esm/rpc/rpc-dispatcher.d.ts +41 -0
- package/dist/esm/rpc/rpc-dispatcher.js +141 -0
- package/dist/esm/types/audit.d.ts +53 -0
- package/dist/esm/types/audit.js +11 -0
- package/dist/esm/types/batch.d.ts +85 -0
- package/dist/esm/types/batch.js +42 -0
- package/dist/esm/types/common.d.ts +250 -0
- package/dist/esm/types/connection.d.ts +72 -0
- package/dist/esm/types/connection.js +7 -0
- package/dist/esm/types/index.d.ts +9 -0
- package/dist/esm/types/openapi.d.ts +195 -0
- package/dist/esm/types/provenance.d.ts +45 -0
- package/dist/esm/types/viewer.d.ts +122 -0
- package/dist/esm/utils/snowflake.d.ts +21 -0
- package/dist/esm/utils/snowflake.js +33 -0
- package/dist/esm/viewer/doover-data-provider.d.ts +90 -0
- package/dist/esm/viewer/doover-data-provider.js +189 -0
- package/dist/esm/viewer/path-parsing.d.ts +5 -0
- package/dist/esm/viewer/path-parsing.js +35 -0
- package/dist/gateway/gateway-client.d.ts +5 -5
- package/dist/gateway/gateway-client.js +5 -5
- package/dist/gateway/index.d.ts +3 -0
- package/dist/gateway/index.js +5 -0
- package/dist/gateway/types.d.ts +1 -1
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.js +9 -0
- package/dist/http/rest-client.d.ts +5 -3
- package/dist/http/rest-client.js +2 -2
- package/dist/index.d.ts +64 -62
- package/dist/index.js +92 -89
- package/dist/node/config-manager.d.ts +2 -2
- package/dist/node/config-manager.js +5 -5
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.js +2 -2
- package/dist/react/context.d.ts +1 -1
- package/dist/react/index.d.ts +38 -38
- package/dist/react/index.js +59 -59
- package/dist/react/messageRangeStore.d.ts +1 -1
- package/dist/react/useAgentChannel.d.ts +3 -3
- package/dist/react/useAgentChannel.js +2 -2
- package/dist/react/useAgentConnections.d.ts +1 -1
- package/dist/react/useAgentConnections.js +2 -2
- package/dist/react/useAgentTokenState.d.ts +3 -3
- package/dist/react/useAgentTokenState.js +8 -8
- package/dist/react/useChannelAggregate.d.ts +3 -3
- package/dist/react/useChannelAggregate.js +8 -8
- package/dist/react/useChannelMessage.d.ts +2 -2
- package/dist/react/useChannelMessage.js +4 -4
- package/dist/react/useChannelMessages.d.ts +3 -3
- package/dist/react/useChannelMessages.js +10 -10
- package/dist/react/useChannelSubscription.d.ts +2 -2
- package/dist/react/useChannelSubscription.js +2 -2
- package/dist/react/useClientStatus.d.ts +1 -1
- package/dist/react/useClientStatus.js +2 -2
- package/dist/react/useConnectionState.js +2 -2
- package/dist/react/useDeviceMap.js +2 -2
- package/dist/react/useInvocationLogs.d.ts +1 -1
- package/dist/react/useInvocationLogs.js +2 -2
- package/dist/react/useMultiAgentAggregates.d.ts +1 -1
- package/dist/react/useMultiAgentAggregates.js +5 -5
- package/dist/react/useMultiAgentChannelMessages.d.ts +1 -1
- package/dist/react/useMultiAgentChannelMessages.js +2 -2
- package/dist/react/useOfflineStatus.d.ts +2 -2
- package/dist/react/useOfflineStatus.js +31 -17
- package/dist/react/useSendMessage.d.ts +2 -2
- package/dist/react/useSendMessage.js +2 -2
- package/dist/react/useSendRpc.d.ts +2 -2
- package/dist/react/useSendRpc.js +2 -2
- package/dist/react/useTurnCredentials.d.ts +2 -2
- package/dist/react/useTurnCredentials.js +2 -2
- package/dist/react/useUpdateAggregate.d.ts +3 -3
- package/dist/react/useUpdateAggregate.js +4 -4
- package/dist/react/useUpdateMessage.d.ts +2 -2
- package/dist/react/useUpdateMessage.js +2 -2
- package/dist/refine/index.d.ts +1 -1
- package/dist/rpc/errors.d.ts +1 -1
- package/dist/rpc/index.d.ts +3 -0
- package/dist/rpc/index.js +7 -0
- package/dist/rpc/rpc-dispatcher.d.ts +4 -4
- package/dist/rpc/rpc-dispatcher.js +2 -2
- package/dist/types/common.d.ts +1 -1
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.js +2 -0
- package/dist/types/openapi.d.ts +1 -1
- package/dist/types/viewer.d.ts +2 -2
- package/dist/viewer/doover-data-provider.d.ts +10 -10
- package/dist/viewer/doover-data-provider.js +25 -25
- package/dist/viewer/path-parsing.d.ts +1 -1
- package/package.json +795 -8
- package/dist/test/api-args.test.js +0 -48
- package/dist/test/api-overloads.test.d.ts +0 -9
- package/dist/test/api-overloads.test.js +0 -330
- package/dist/test/apis.test.js +0 -408
- package/dist/test/auth.test.js +0 -708
- package/dist/test/batch-apis.test.js +0 -183
- package/dist/test/capabilities.test.js +0 -27
- package/dist/test/config-manager.test.js +0 -160
- package/dist/test/data-client-errors.test.js +0 -24
- package/dist/test/data-client-shape.test.js +0 -28
- package/dist/test/doover-client-dataclient.test.d.ts +0 -1
- package/dist/test/doover-client-dataclient.test.js +0 -58
- package/dist/test/doover-client-provenance.test.d.ts +0 -1
- package/dist/test/doover-client-provenance.test.js +0 -32
- package/dist/test/doover-client.test.d.ts +0 -1
- package/dist/test/doover-client.test.js +0 -42
- package/dist/test/doover-data-provider.test.d.ts +0 -1
- package/dist/test/doover-data-provider.test.js +0 -657
- package/dist/test/exports.test.d.ts +0 -1
- package/dist/test/exports.test.js +0 -80
- package/dist/test/gateway-client.test.d.ts +0 -1
- package/dist/test/gateway-client.test.js +0 -474
- package/dist/test/gateway-provenance.test.d.ts +0 -1
- package/dist/test/gateway-provenance.test.js +0 -29
- package/dist/test/gateway-subscriptions.test.d.ts +0 -1
- package/dist/test/gateway-subscriptions.test.js +0 -95
- package/dist/test/helpers.d.ts +0 -32
- package/dist/test/helpers.js +0 -115
- package/dist/test/local-agent-client.test.d.ts +0 -1
- package/dist/test/local-agent-client.test.js +0 -202
- package/dist/test/message-range-store.test.d.ts +0 -1
- package/dist/test/message-range-store.test.js +0 -183
- package/dist/test/multiplex-capabilities.test.d.ts +0 -1
- package/dist/test/multiplex-capabilities.test.js +0 -37
- package/dist/test/multiplex-conflicts.test.d.ts +0 -1
- package/dist/test/multiplex-conflicts.test.js +0 -35
- package/dist/test/multiplex-gateway.test.d.ts +0 -1
- package/dist/test/multiplex-gateway.test.js +0 -103
- package/dist/test/multiplex-merge.test.d.ts +0 -1
- package/dist/test/multiplex-merge.test.js +0 -19
- package/dist/test/multiplex-noncore.test.d.ts +0 -1
- package/dist/test/multiplex-noncore.test.js +0 -82
- package/dist/test/multiplex-passthrough.test.d.ts +0 -1
- package/dist/test/multiplex-passthrough.test.js +0 -35
- package/dist/test/multiplex-reads.test.d.ts +0 -1
- package/dist/test/multiplex-reads.test.js +0 -87
- package/dist/test/multiplex-registry.test.d.ts +0 -1
- package/dist/test/multiplex-registry.test.js +0 -81
- package/dist/test/multiplex-routing.test.d.ts +0 -1
- package/dist/test/multiplex-routing.test.js +0 -45
- package/dist/test/multiplex-status.test.d.ts +0 -1
- package/dist/test/multiplex-status.test.js +0 -63
- package/dist/test/multiplex-writes.test.d.ts +0 -1
- package/dist/test/multiplex-writes.test.js +0 -93
- package/dist/test/offline-cache.test.d.ts +0 -1
- package/dist/test/offline-cache.test.js +0 -289
- package/dist/test/provenance-regression.test.d.ts +0 -1
- package/dist/test/provenance-regression.test.js +0 -45
- package/dist/test/provenance-stamper.test.d.ts +0 -1
- package/dist/test/provenance-stamper.test.js +0 -41
- package/dist/test/provenance-type.test.d.ts +0 -1
- package/dist/test/provenance-type.test.js +0 -15
- package/dist/test/react-channel-messages-forward.test.d.ts +0 -1
- package/dist/test/react-channel-messages-forward.test.js +0 -139
- package/dist/test/react-channel-messages-range.test.d.ts +0 -1
- package/dist/test/react-channel-messages-range.test.js +0 -109
- package/dist/test/react-client-status.test.d.ts +0 -1
- package/dist/test/react-client-status.test.js +0 -35
- package/dist/test/react-dataclient.test.d.ts +0 -1
- package/dist/test/react-dataclient.test.js +0 -28
- package/dist/test/react-exports.test.d.ts +0 -1
- package/dist/test/react-exports.test.js +0 -46
- package/dist/test/react-multiagent-messages.test.d.ts +0 -1
- package/dist/test/react-multiagent-messages.test.js +0 -113
- package/dist/test/react-sources-option.test.d.ts +0 -1
- package/dist/test/react-sources-option.test.js +0 -41
- package/dist/test/react.test.d.ts +0 -1
- package/dist/test/react.test.js +0 -482
- package/dist/test/refine.test.d.ts +0 -1
- package/dist/test/refine.test.js +0 -71
- package/dist/test/rest-client.test.d.ts +0 -1
- package/dist/test/rest-client.test.js +0 -197
- package/dist/test/rpc-dispatcher.test.d.ts +0 -1
- package/dist/test/rpc-dispatcher.test.js +0 -251
- package/dist/test/singleton.test.d.ts +0 -1
- package/dist/test/singleton.test.js +0 -62
- package/dist/test/stats-rpc.test.d.ts +0 -1
- package/dist/test/stats-rpc.test.js +0 -69
- package/dist/test/status-tracker.test.d.ts +0 -1
- package/dist/test/status-tracker.test.js +0 -85
- package/dist/test/users-api.test.d.ts +0 -1
- package/dist/test/users-api.test.js +0 -19
- package/dist/test/utils.test.d.ts +0 -1
- package/dist/test/utils.test.js +0 -64
- /package/dist/{test/api-args.test.d.ts → esm/auth/auth-store.js} +0 -0
- /package/dist/{test/apis.test.d.ts → esm/client/data-client.js} +0 -0
- /package/dist/{test/auth.test.d.ts → esm/gateway/types.js} +0 -0
- /package/dist/{test/batch-apis.test.d.ts → esm/types/common.js} +0 -0
- /package/dist/{test/capabilities.test.d.ts → esm/types/index.js} +0 -0
- /package/dist/{test/config-manager.test.d.ts → esm/types/openapi.js} +0 -0
- /package/dist/{test/data-client-errors.test.d.ts → esm/types/provenance.js} +0 -0
- /package/dist/{test/data-client-shape.test.d.ts → esm/types/viewer.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
// src/test/multiplex-writes.test.ts
|
|
40
|
-
const chai_1 = require("chai");
|
|
41
|
-
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
42
|
-
const chai = __importStar(require("chai"));
|
|
43
|
-
const mocha_1 = require("mocha");
|
|
44
|
-
const multiplex_client_1 = require("../client/multiplex-client");
|
|
45
|
-
const errors_1 = require("../client/errors");
|
|
46
|
-
chai.use(chai_as_promised_1.default);
|
|
47
|
-
const { expect: xp } = chai;
|
|
48
|
-
function writeMember(id, scope, caps, sink) {
|
|
49
|
-
const noop = new Proxy({}, { get: () => () => Promise.resolve(undefined) });
|
|
50
|
-
const post = async (agentId) => { sink.push(`${id}:${agentId}`); return { id: "m", data: {}, attachments: [], author_id: "a", channel: { agent_id: agentId, name: "c" } }; };
|
|
51
|
-
return {
|
|
52
|
-
agents: noop, channels: noop,
|
|
53
|
-
messages: { postMessage: (a) => post(a) },
|
|
54
|
-
aggregates: { putAggregate: async (a) => { sink.push(`${id}:put:${a}`); return { data: {}, attachments: [] }; } },
|
|
55
|
-
alarms: noop, connections: noop, notifications: noop, permissions: noop, processors: noop, turn: noop, users: noop, rpc: noop,
|
|
56
|
-
gateway: { connect: async () => { }, disconnect: () => { }, reconnect: async () => { }, on: () => { }, off: () => { }, subscribe: () => { }, unsubscribe: () => { }, subscribeToChannel: () => () => { }, syncChannel: () => { }, sendOneShotMessage: () => { }, getSession: () => null, isConnected: () => false, getSubscriptionCount: () => 0, getSubscriptions: () => [], setStats: () => { } },
|
|
57
|
-
getCapabilities: () => new Set(caps), supports: (c) => caps.includes(c),
|
|
58
|
-
isConnected: () => false, getStatus: () => ({ clientId: id, connected: false, state: "disconnected", agentScope: scope, at: Date.now() }),
|
|
59
|
-
onStatusChange: () => () => { },
|
|
60
|
-
getAgentScope: async () => scope, getKnownAgentScope: () => scope,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
(0, mocha_1.describe)("MultiplexClient writes", () => {
|
|
64
|
-
function mk(members) {
|
|
65
|
-
const factory = (d) => members[d.id];
|
|
66
|
-
return new multiplex_client_1.MultiplexClient({ factory, register: Object.keys(members).map((id) => ({ id, kind: id.startsWith("local") ? "local" : "cloud" })), enableAll: true });
|
|
67
|
-
}
|
|
68
|
-
(0, mocha_1.it)("routes to the single member that owns the agent and has the write cap", async () => {
|
|
69
|
-
const sink = [];
|
|
70
|
-
const mux = mk({
|
|
71
|
-
cloud: writeMember("cloud", { mode: "all" }, ["messages.post"], sink),
|
|
72
|
-
"local:7": writeMember("local:7", { mode: "list", agentIds: ["dev7"] }, ["messages.post"], sink),
|
|
73
|
-
});
|
|
74
|
-
// dev99 only owned by cloud (local:7 owns dev7) → routes to cloud
|
|
75
|
-
await mux.messages.postMessage("dev99", "c", { x: 1 });
|
|
76
|
-
(0, chai_1.expect)(sink).to.deep.equal(["cloud:dev99"]);
|
|
77
|
-
});
|
|
78
|
-
(0, mocha_1.it)("ambiguous when 2+ members own the agent and have the cap → AmbiguousWriteError", async () => {
|
|
79
|
-
const sink = [];
|
|
80
|
-
const mux = mk({
|
|
81
|
-
cloud: writeMember("cloud", { mode: "all" }, ["messages.post"], sink),
|
|
82
|
-
"local:7": writeMember("local:7", { mode: "list", agentIds: ["dev7"] }, ["messages.post"], sink),
|
|
83
|
-
});
|
|
84
|
-
await xp(mux.messages.postMessage("dev7", "c", { x: 1 })).to.be.rejectedWith(errors_1.AmbiguousWriteError);
|
|
85
|
-
// …unless scoped to one:
|
|
86
|
-
await mux.messages.postMessage("dev7", "c", { x: 1 }, { sources: ["local:7"] });
|
|
87
|
-
(0, chai_1.expect)(sink).to.deep.equal(["local:7:dev7"]);
|
|
88
|
-
});
|
|
89
|
-
(0, mocha_1.it)("no member with the cap → UnsupportedCapabilityError", async () => {
|
|
90
|
-
const mux = mk({ cloud: writeMember("cloud", { mode: "all" }, ["messages.list"], []) });
|
|
91
|
-
await xp(mux.messages.postMessage("dev7", "c", {})).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
|
|
92
|
-
});
|
|
93
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const chai_1 = require("chai");
|
|
4
|
-
const mocha_1 = require("mocha");
|
|
5
|
-
const doover_client_1 = require("../client/doover-client");
|
|
6
|
-
const offline_cache_1 = require("../client/offline-cache");
|
|
7
|
-
const request_options_1 = require("../client/request-options");
|
|
8
|
-
const errors_1 = require("../client/errors");
|
|
9
|
-
const snowflake_1 = require("../utils/snowflake");
|
|
10
|
-
const helpers_1 = require("./helpers");
|
|
11
|
-
function makeOnlineClient(fetchImpl) {
|
|
12
|
-
return new doover_client_1.DooverClient({
|
|
13
|
-
dataRestUrl: "https://api.example.com",
|
|
14
|
-
controlApiUrl: "https://control.example.com",
|
|
15
|
-
dataWssUrl: "wss://ws.example.com",
|
|
16
|
-
fetchImpl,
|
|
17
|
-
webSocketImpl: helpers_1.MockWebSocket,
|
|
18
|
-
disableBrowserLifecycleHooks: true,
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
(0, mocha_1.describe)("requestOptions", () => {
|
|
22
|
-
(0, mocha_1.it)("marks a request-options bag explicitly", () => {
|
|
23
|
-
const options = (0, request_options_1.requestOptions)({
|
|
24
|
-
sources: ["cloud"],
|
|
25
|
-
cache: { policy: "tag-values-history" },
|
|
26
|
-
});
|
|
27
|
-
(0, chai_1.expect)(options[request_options_1.REQUEST_OPTIONS_SYMBOL]).to.equal(true);
|
|
28
|
-
(0, chai_1.expect)(options.sources).to.deep.equal(["cloud"]);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
(0, mocha_1.describe)("OfflineDataClient", () => {
|
|
32
|
-
(0, mocha_1.it)("caches reads covered by a stored channel policy and serves them offline", async () => {
|
|
33
|
-
let online = true;
|
|
34
|
-
const messageId = (0, snowflake_1.generateSnowflakeIdAtTime)(new Date("2026-06-10T00:00:00Z"));
|
|
35
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
36
|
-
if (url.includes("/agents/a1/channels/tag_values/messages")) {
|
|
37
|
-
return (0, helpers_1.createJsonResponse)([
|
|
38
|
-
{
|
|
39
|
-
id: messageId,
|
|
40
|
-
data: { value: 42 },
|
|
41
|
-
attachments: [],
|
|
42
|
-
author_id: "u1",
|
|
43
|
-
channel: { agent_id: "a1", name: "tag_values" },
|
|
44
|
-
},
|
|
45
|
-
]);
|
|
46
|
-
}
|
|
47
|
-
return (0, helpers_1.createJsonResponse)({ ok: true });
|
|
48
|
-
});
|
|
49
|
-
const storage = new offline_cache_1.MemoryOfflineStorageAdapter();
|
|
50
|
-
const client = new offline_cache_1.OfflineDataClient({
|
|
51
|
-
client: makeOnlineClient(fetchMock),
|
|
52
|
-
storage,
|
|
53
|
-
scope: { userId: "u1", organisationId: "org1", sourceId: "cloud" },
|
|
54
|
-
isOnline: () => online,
|
|
55
|
-
});
|
|
56
|
-
client.setChannelPolicy({
|
|
57
|
-
id: "tag-values-history",
|
|
58
|
-
channel: { agentId: "a1", channelName: "tag_values" },
|
|
59
|
-
messages: { mode: "latest", count: 100 },
|
|
60
|
-
});
|
|
61
|
-
const onlineMessages = await client.messages.listMessages({ agentId: "a1", channelName: "tag_values" }, { limit: 100, order: "asc" });
|
|
62
|
-
(0, chai_1.expect)(onlineMessages.map((message) => message.data)).to.deep.equal([{ value: 42 }]);
|
|
63
|
-
online = false;
|
|
64
|
-
const offlineMessages = await client.messages.listMessages({ agentId: "a1", channelName: "tag_values" }, { limit: 100, order: "asc" });
|
|
65
|
-
(0, chai_1.expect)(offlineMessages).to.deep.equal(onlineMessages);
|
|
66
|
-
(0, chai_1.expect)(fetchMock.callCount).to.equal(1);
|
|
67
|
-
});
|
|
68
|
-
(0, mocha_1.it)("supports per-call cache opt-in for discovery reads", async () => {
|
|
69
|
-
let online = true;
|
|
70
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
71
|
-
if (url.includes("/agents/")) {
|
|
72
|
-
return (0, helpers_1.createJsonResponse)({
|
|
73
|
-
agents: [
|
|
74
|
-
{
|
|
75
|
-
id: "a1",
|
|
76
|
-
organisation: "org1",
|
|
77
|
-
name: "pump",
|
|
78
|
-
display_name: "Pump",
|
|
79
|
-
archived: false,
|
|
80
|
-
group: "",
|
|
81
|
-
type: "device",
|
|
82
|
-
fixed_location: { latitude: 0, longitude: 0 },
|
|
83
|
-
extra_config: {},
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
count: 1,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
return (0, helpers_1.createJsonResponse)({ ok: true });
|
|
90
|
-
});
|
|
91
|
-
const client = new offline_cache_1.OfflineDataClient({
|
|
92
|
-
client: makeOnlineClient(fetchMock),
|
|
93
|
-
storage: new offline_cache_1.MemoryOfflineStorageAdapter(),
|
|
94
|
-
scope: { userId: "u1", organisationId: "org1", sourceId: "cloud" },
|
|
95
|
-
isOnline: () => online,
|
|
96
|
-
});
|
|
97
|
-
const onlineAgents = await client.agents.listAgents((0, request_options_1.requestOptions)({ cache: { mode: "read-through", policy: "agents" } }));
|
|
98
|
-
(0, chai_1.expect)((onlineAgents.agents ?? []).map((agent) => agent.id)).to.deep.equal(["a1"]);
|
|
99
|
-
online = false;
|
|
100
|
-
const offlineAgents = await client.agents.listAgents((0, request_options_1.requestOptions)({ cache: { mode: "read-through", policy: "agents" } }));
|
|
101
|
-
(0, chai_1.expect)(offlineAgents).to.deep.equal(onlineAgents);
|
|
102
|
-
(0, chai_1.expect)(fetchMock.callCount).to.equal(1);
|
|
103
|
-
});
|
|
104
|
-
(0, mocha_1.it)("fails writes immediately while offline", async () => {
|
|
105
|
-
const fetchMock = (0, helpers_1.createFetchMock)();
|
|
106
|
-
const client = new offline_cache_1.OfflineDataClient({
|
|
107
|
-
client: makeOnlineClient(fetchMock),
|
|
108
|
-
storage: new offline_cache_1.MemoryOfflineStorageAdapter(),
|
|
109
|
-
scope: { userId: "u1", organisationId: "org1", sourceId: "cloud" },
|
|
110
|
-
isOnline: () => false,
|
|
111
|
-
});
|
|
112
|
-
let error;
|
|
113
|
-
try {
|
|
114
|
-
await client.messages.postMessage({ agentId: "a1", channelName: "commands" }, { data: { run: true } });
|
|
115
|
-
}
|
|
116
|
-
catch (err) {
|
|
117
|
-
error = err;
|
|
118
|
-
}
|
|
119
|
-
(0, chai_1.expect)(error).to.be.instanceOf(errors_1.DooverOfflineError);
|
|
120
|
-
(0, chai_1.expect)(fetchMock.callCount).to.equal(0);
|
|
121
|
-
});
|
|
122
|
-
(0, mocha_1.it)("honours cache: false even when a stored policy exists", async () => {
|
|
123
|
-
let online = true;
|
|
124
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
125
|
-
if (url.includes("/agents/a1/channels/tag_values/messages")) {
|
|
126
|
-
return (0, helpers_1.createJsonResponse)([
|
|
127
|
-
{
|
|
128
|
-
id: (0, snowflake_1.generateSnowflakeIdAtTime)(new Date("2026-06-10T00:00:00Z")),
|
|
129
|
-
data: { value: 1 },
|
|
130
|
-
attachments: [],
|
|
131
|
-
author_id: "u1",
|
|
132
|
-
channel: { agent_id: "a1", name: "tag_values" },
|
|
133
|
-
},
|
|
134
|
-
]);
|
|
135
|
-
}
|
|
136
|
-
return (0, helpers_1.createJsonResponse)({ ok: true });
|
|
137
|
-
});
|
|
138
|
-
const client = new offline_cache_1.OfflineDataClient({
|
|
139
|
-
client: makeOnlineClient(fetchMock),
|
|
140
|
-
storage: new offline_cache_1.MemoryOfflineStorageAdapter(),
|
|
141
|
-
scope: { userId: "u1", organisationId: "org1", sourceId: "cloud" },
|
|
142
|
-
isOnline: () => online,
|
|
143
|
-
});
|
|
144
|
-
client.setChannelPolicy({
|
|
145
|
-
id: "tag-values-history",
|
|
146
|
-
channel: { agentId: "a1", channelName: "tag_values" },
|
|
147
|
-
messages: { mode: "latest", count: 100 },
|
|
148
|
-
});
|
|
149
|
-
await client.messages.listMessages({ agentId: "a1", channelName: "tag_values" }, { limit: 100, order: "asc" }, (0, request_options_1.requestOptions)({ cache: false }));
|
|
150
|
-
online = false;
|
|
151
|
-
let error;
|
|
152
|
-
try {
|
|
153
|
-
await client.messages.listMessages({ agentId: "a1", channelName: "tag_values" }, { limit: 100, order: "asc" }, (0, request_options_1.requestOptions)({ cache: false }));
|
|
154
|
-
}
|
|
155
|
-
catch (err) {
|
|
156
|
-
error = err;
|
|
157
|
-
}
|
|
158
|
-
(0, chai_1.expect)(error).to.be.instanceOf(errors_1.DooverOfflineError);
|
|
159
|
-
});
|
|
160
|
-
(0, mocha_1.it)("tracks expired cached records and requires allowExpired to read them", async () => {
|
|
161
|
-
let online = true;
|
|
162
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
163
|
-
if (url.includes("/agents/"))
|
|
164
|
-
return (0, helpers_1.createJsonResponse)({ agents: [], count: 0 });
|
|
165
|
-
return (0, helpers_1.createJsonResponse)({ ok: true });
|
|
166
|
-
});
|
|
167
|
-
const client = new offline_cache_1.OfflineDataClient({
|
|
168
|
-
client: makeOnlineClient(fetchMock),
|
|
169
|
-
storage: new offline_cache_1.MemoryOfflineStorageAdapter(),
|
|
170
|
-
scope: { userId: "u1", organisationId: "org1", sourceId: "cloud" },
|
|
171
|
-
isOnline: () => online,
|
|
172
|
-
});
|
|
173
|
-
await client.agents.listAgents((0, request_options_1.requestOptions)({ cache: { mode: "read-through", retentionMs: 1 } }));
|
|
174
|
-
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
175
|
-
online = false;
|
|
176
|
-
let error;
|
|
177
|
-
try {
|
|
178
|
-
await client.agents.listAgents((0, request_options_1.requestOptions)({ cache: { mode: "read-through" } }));
|
|
179
|
-
}
|
|
180
|
-
catch (err) {
|
|
181
|
-
error = err;
|
|
182
|
-
}
|
|
183
|
-
(0, chai_1.expect)(error).to.be.instanceOf(errors_1.DooverOfflineError);
|
|
184
|
-
(0, chai_1.expect)(client.getOfflineStatus().state).to.equal("cache-miss");
|
|
185
|
-
const expired = await client.agents.listAgents((0, request_options_1.requestOptions)({ cache: { mode: "read-through", allowExpired: true } }));
|
|
186
|
-
(0, chai_1.expect)(expired.agents).to.deep.equal([]);
|
|
187
|
-
(0, chai_1.expect)(client.getOfflineStatus().isExpired).to.equal(true);
|
|
188
|
-
});
|
|
189
|
-
(0, mocha_1.it)("persists gateway messages into latest-N cache according to channel policy", async () => {
|
|
190
|
-
let online = true;
|
|
191
|
-
const fetchMock = (0, helpers_1.createFetchMock)();
|
|
192
|
-
const client = new offline_cache_1.OfflineDataClient({
|
|
193
|
-
client: makeOnlineClient(fetchMock),
|
|
194
|
-
storage: new offline_cache_1.MemoryOfflineStorageAdapter(),
|
|
195
|
-
scope: { userId: "u1", organisationId: "org1", sourceId: "cloud" },
|
|
196
|
-
isOnline: () => online,
|
|
197
|
-
});
|
|
198
|
-
client.setChannelPolicy({
|
|
199
|
-
id: "camera-latest",
|
|
200
|
-
channel: { agentId: "a1", channelName: "camera" },
|
|
201
|
-
messages: { mode: "latest", count: 2 },
|
|
202
|
-
});
|
|
203
|
-
client.gateway.subscribeToChannel({ agent_id: "a1", name: "camera" }, {});
|
|
204
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
205
|
-
const ws = helpers_1.MockWebSocket.instances[helpers_1.MockWebSocket.instances.length - 1];
|
|
206
|
-
ws.open();
|
|
207
|
-
ws.receive({ op: 0, t: "Hello", d: {} });
|
|
208
|
-
ws.receive({
|
|
209
|
-
op: 0,
|
|
210
|
-
t: "Ready",
|
|
211
|
-
d: { session_id: "s1", session_token: "t1", subscriptions: [] },
|
|
212
|
-
});
|
|
213
|
-
for (const [idx, iso] of [
|
|
214
|
-
"2026-06-10T00:00:00Z",
|
|
215
|
-
"2026-06-10T00:01:00Z",
|
|
216
|
-
"2026-06-10T00:02:00Z",
|
|
217
|
-
].entries()) {
|
|
218
|
-
ws.receive({
|
|
219
|
-
op: 0,
|
|
220
|
-
t: "MessageCreate",
|
|
221
|
-
d: {
|
|
222
|
-
id: (0, snowflake_1.generateSnowflakeIdAtTime)(new Date(iso)),
|
|
223
|
-
data: { idx },
|
|
224
|
-
attachments: [],
|
|
225
|
-
author_id: "u1",
|
|
226
|
-
channel: { agent_id: "a1", name: "camera" },
|
|
227
|
-
},
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
231
|
-
online = false;
|
|
232
|
-
const messages = await client.messages.listMessages({ agentId: "a1", channelName: "camera" }, { limit: 10, order: "asc" });
|
|
233
|
-
(0, chai_1.expect)(messages.map((message) => message.data)).to.deep.equal([
|
|
234
|
-
{ idx: 1 },
|
|
235
|
-
{ idx: 2 },
|
|
236
|
-
]);
|
|
237
|
-
(0, chai_1.expect)(client.getOfflineStatus().state).to.equal("cache-fallback");
|
|
238
|
-
});
|
|
239
|
-
(0, mocha_1.it)("notifies offline status listeners when cached data is used", async () => {
|
|
240
|
-
let online = true;
|
|
241
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
242
|
-
if (url.includes("/agents/"))
|
|
243
|
-
return (0, helpers_1.createJsonResponse)({ agents: [], count: 0 });
|
|
244
|
-
return (0, helpers_1.createJsonResponse)({ ok: true });
|
|
245
|
-
});
|
|
246
|
-
const client = new offline_cache_1.OfflineDataClient({
|
|
247
|
-
client: makeOnlineClient(fetchMock),
|
|
248
|
-
storage: new offline_cache_1.MemoryOfflineStorageAdapter(),
|
|
249
|
-
scope: { userId: "u1", organisationId: "org1", sourceId: "cloud" },
|
|
250
|
-
isOnline: () => online,
|
|
251
|
-
});
|
|
252
|
-
const seen = [];
|
|
253
|
-
const off = client.onOfflineStatusChange((status) => seen.push(status.state));
|
|
254
|
-
await client.agents.listAgents((0, request_options_1.requestOptions)({ cache: { mode: "read-through" } }));
|
|
255
|
-
online = false;
|
|
256
|
-
await client.agents.listAgents((0, request_options_1.requestOptions)({ cache: { mode: "read-through" } }));
|
|
257
|
-
off();
|
|
258
|
-
(0, chai_1.expect)(seen).to.include("online");
|
|
259
|
-
(0, chai_1.expect)(seen).to.include("cache-fallback");
|
|
260
|
-
});
|
|
261
|
-
(0, mocha_1.it)("caches selected attachment blobs through the blob storage adapter", async () => {
|
|
262
|
-
let online = true;
|
|
263
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
264
|
-
if (url.includes("/attachments/thumb1")) {
|
|
265
|
-
return (0, helpers_1.createBlobResponse)("thumbnail-bytes", {
|
|
266
|
-
headers: { "content-type": "image/jpeg" },
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
return (0, helpers_1.createJsonResponse)({ ok: true });
|
|
270
|
-
});
|
|
271
|
-
const client = new offline_cache_1.OfflineDataClient({
|
|
272
|
-
client: makeOnlineClient(fetchMock),
|
|
273
|
-
storage: new offline_cache_1.MemoryOfflineStorageAdapter(),
|
|
274
|
-
scope: { userId: "u1", organisationId: "org1", sourceId: "cloud" },
|
|
275
|
-
isOnline: () => online,
|
|
276
|
-
});
|
|
277
|
-
client.setChannelPolicy({
|
|
278
|
-
id: "camera-thumbnails",
|
|
279
|
-
channel: { agentId: "a1", channelName: "camera" },
|
|
280
|
-
messageAttachments: { include: "metadata-and-selected-blobs" },
|
|
281
|
-
});
|
|
282
|
-
const onlineBlob = await client.messages.getMessageAttachment({ agentId: "a1", channelName: "camera" }, "m1", "thumb1");
|
|
283
|
-
(0, chai_1.expect)(await onlineBlob.text()).to.equal("thumbnail-bytes");
|
|
284
|
-
online = false;
|
|
285
|
-
const offlineBlob = await client.messages.getMessageAttachment({ agentId: "a1", channelName: "camera" }, "m1", "thumb1");
|
|
286
|
-
(0, chai_1.expect)(await offlineBlob.text()).to.equal("thumbnail-bytes");
|
|
287
|
-
(0, chai_1.expect)(fetchMock.callCount).to.equal(1);
|
|
288
|
-
});
|
|
289
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const chai_1 = require("chai");
|
|
4
|
-
const mocha_1 = require("mocha");
|
|
5
|
-
const doover_client_1 = require("../client/doover-client");
|
|
6
|
-
const helpers_1 = require("./helpers");
|
|
7
|
-
function stripSource(v) {
|
|
8
|
-
return JSON.parse(JSON.stringify(v, (k, val) => (k === "__source" ? undefined : val)));
|
|
9
|
-
}
|
|
10
|
-
(0, mocha_1.describe)("provenance is additive only", () => {
|
|
11
|
-
(0, mocha_1.it)("REST payloads equal the wire body once __source is stripped", async () => {
|
|
12
|
-
const wire = { name: "c1", is_private: false, owner_id: "o", id: "ch1" };
|
|
13
|
-
const client = new doover_client_1.DooverClient({
|
|
14
|
-
dataRestUrl: "https://api.example.com",
|
|
15
|
-
controlApiUrl: "https://control.example.com",
|
|
16
|
-
dataWssUrl: "wss://ws.example.com",
|
|
17
|
-
fetchImpl: (0, helpers_1.createFetchMock)(() => (0, helpers_1.createJsonResponse)(wire)),
|
|
18
|
-
webSocketImpl: helpers_1.MockWebSocket,
|
|
19
|
-
disableBrowserLifecycleHooks: true,
|
|
20
|
-
});
|
|
21
|
-
const channel = await client.channels.getChannel("a1", "c1");
|
|
22
|
-
(0, chai_1.expect)(channel.__source).to.exist; // it IS stamped
|
|
23
|
-
(0, chai_1.expect)(stripSource(channel)).to.deep.equal(wire); // …but otherwise byte-identical
|
|
24
|
-
});
|
|
25
|
-
(0, mocha_1.it)("listMessages stamps each element, leaving the array shape intact", async () => {
|
|
26
|
-
const wire = [
|
|
27
|
-
{ id: "2", data: { v: 2 }, attachments: [], author_id: "a", channel: { agent_id: "a1", name: "c1" } },
|
|
28
|
-
{ id: "1", data: { v: 1 }, attachments: [], author_id: "a", channel: { agent_id: "a1", name: "c1" } },
|
|
29
|
-
];
|
|
30
|
-
const client = new doover_client_1.DooverClient({
|
|
31
|
-
dataRestUrl: "https://api.example.com",
|
|
32
|
-
controlApiUrl: "https://control.example.com",
|
|
33
|
-
dataWssUrl: "wss://ws.example.com",
|
|
34
|
-
fetchImpl: (0, helpers_1.createFetchMock)(() => (0, helpers_1.createJsonResponse)(wire)),
|
|
35
|
-
webSocketImpl: helpers_1.MockWebSocket,
|
|
36
|
-
disableBrowserLifecycleHooks: true,
|
|
37
|
-
});
|
|
38
|
-
const msgs = await client.messages.listMessages("a1", "c1", { limit: 2 });
|
|
39
|
-
(0, chai_1.expect)(msgs).to.have.length(2);
|
|
40
|
-
(0, chai_1.expect)(msgs[0].__source?.via).to.include({ method: "messages.listMessages" });
|
|
41
|
-
// shape minus __source and the client-added `timestamp` matches the wire item
|
|
42
|
-
const { __source: _s, timestamp: _t, ...rest } = msgs[0];
|
|
43
|
-
(0, chai_1.expect)(rest).to.deep.equal(wire[0]);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const chai_1 = require("chai");
|
|
4
|
-
const mocha_1 = require("mocha");
|
|
5
|
-
const provenance_1 = require("../client/provenance");
|
|
6
|
-
(0, mocha_1.describe)("ProvenanceStamper", () => {
|
|
7
|
-
const stamper = new provenance_1.ProvenanceStamper({ id: "cloud", kind: "cloud", meta: { x: 1 } });
|
|
8
|
-
(0, mocha_1.it)("stamps a plain object top-level", () => {
|
|
9
|
-
const out = stamper.stampRest({ a: 1 }, { method: "x.y", request: { z: 2 }, startedAt: 0, durationMs: 5, status: 200 });
|
|
10
|
-
(0, chai_1.expect)(out).to.include({ a: 1 });
|
|
11
|
-
(0, chai_1.expect)(out.__source?.client.id).to.equal("cloud");
|
|
12
|
-
(0, chai_1.expect)(out.__source?.via).to.deep.include({ transport: "rest", method: "x.y", durationMs: 5, status: 200 });
|
|
13
|
-
});
|
|
14
|
-
(0, mocha_1.it)("stamps each element of an array", () => {
|
|
15
|
-
const out = stamper.stampRest([{ a: 1 }, { a: 2 }], { method: "x.list", request: {}, startedAt: 0, durationMs: 1 });
|
|
16
|
-
(0, chai_1.expect)(out[0].__source?.client.kind).to.equal("cloud");
|
|
17
|
-
(0, chai_1.expect)(out[1].__source?.client.kind).to.equal("cloud");
|
|
18
|
-
});
|
|
19
|
-
(0, mocha_1.it)("stamps array-valued props one level deep (e.g. { results: [...] })", () => {
|
|
20
|
-
const out = stamper.stampRest({ results: [{ a: 1 }], count: 1 }, { method: "x.batch", request: {}, startedAt: 0, durationMs: 1 });
|
|
21
|
-
(0, chai_1.expect)(out.__source?.client.id).to.equal("cloud");
|
|
22
|
-
(0, chai_1.expect)(out.results[0].__source?.client.id).to.equal("cloud");
|
|
23
|
-
});
|
|
24
|
-
(0, mocha_1.it)("leaves Blobs and primitives untouched", () => {
|
|
25
|
-
const blob = new Blob(["x"]);
|
|
26
|
-
(0, chai_1.expect)(stamper.stampRest(blob, { method: "m", request: {}, startedAt: 0, durationMs: 1 })).to.equal(blob);
|
|
27
|
-
(0, chai_1.expect)(stamper.stampRest(undefined, { method: "m", request: {}, startedAt: 0, durationMs: 1 })).to.equal(undefined);
|
|
28
|
-
});
|
|
29
|
-
(0, mocha_1.it)("wrapSubclient stamps awaited results with subclient.method", async () => {
|
|
30
|
-
const api = { thing: async () => ({ a: 1 }), sync: () => 42 };
|
|
31
|
-
const wrapped = (0, provenance_1.wrapSubclient)(api, "channels", stamper);
|
|
32
|
-
const r = await wrapped.thing();
|
|
33
|
-
(0, chai_1.expect)(r.__source?.via).to.include({ method: "channels.thing", transport: "rest" });
|
|
34
|
-
(0, chai_1.expect)(wrapped.sync()).to.equal(42); // sync passthrough
|
|
35
|
-
});
|
|
36
|
-
(0, mocha_1.it)("stampGatewayEvent stamps payload + nested aggregate/message", () => {
|
|
37
|
-
const out = stamper.stampGatewayEvent({ author_id: "a", channel: { agent_id: "x", name: "c" }, aggregate: { data: {}, attachments: [] } }, { event: "aggregateUpdate", sessionId: "s1" });
|
|
38
|
-
(0, chai_1.expect)(out.__source?.via).to.deep.include({ transport: "gateway", event: "aggregateUpdate", sessionId: "s1" });
|
|
39
|
-
(0, chai_1.expect)(out.aggregate.__source?.via).to.deep.include({ transport: "gateway", event: "aggregateUpdate" });
|
|
40
|
-
});
|
|
41
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const chai_1 = require("chai");
|
|
4
|
-
const mocha_1 = require("mocha");
|
|
5
|
-
(0, mocha_1.describe)("SourceProvenance", () => {
|
|
6
|
-
(0, mocha_1.it)("is structurally usable on existing data shapes (compile-time)", () => {
|
|
7
|
-
const prov = {
|
|
8
|
-
client: { id: "cloud", kind: "cloud" },
|
|
9
|
-
retrievedAt: Date.now(),
|
|
10
|
-
via: { transport: "rest", method: "aggregates.getAggregate", request: {}, startedAt: 0, durationMs: 1 },
|
|
11
|
-
};
|
|
12
|
-
const agg = { data: {}, attachments: [], __source: prov };
|
|
13
|
-
(0, chai_1.expect)(agg.__source?.client.kind).to.equal("cloud");
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
-
const chai_1 = require("chai");
|
|
8
|
-
const mocha_1 = require("mocha");
|
|
9
|
-
const react_1 = require("@testing-library/react");
|
|
10
|
-
const react_query_1 = require("@tanstack/react-query");
|
|
11
|
-
const sinon_1 = __importDefault(require("sinon"));
|
|
12
|
-
const doover_client_1 = require("../client/doover-client");
|
|
13
|
-
const react_2 = require("../react");
|
|
14
|
-
const messageRangeStore_1 = require("../react/messageRangeStore");
|
|
15
|
-
const snowflake_1 = require("../utils/snowflake");
|
|
16
|
-
const helpers_1 = require("./helpers");
|
|
17
|
-
const AGENT = "agent-1";
|
|
18
|
-
const CHANNEL = "camera_1";
|
|
19
|
-
const NOW = Date.now();
|
|
20
|
-
/** `COUNT` messages, one per minute, ascending by id (index 0 = oldest). */
|
|
21
|
-
const COUNT = 60;
|
|
22
|
-
const ALL = Array.from({ length: COUNT }, (_, i) => {
|
|
23
|
-
const at = new Date(NOW - (COUNT - 1 - i) * 60000);
|
|
24
|
-
return {
|
|
25
|
-
id: (0, snowflake_1.generateSnowflakeIdAtTime)(at),
|
|
26
|
-
data: { i },
|
|
27
|
-
attachments: [],
|
|
28
|
-
author_id: "author",
|
|
29
|
-
channel: { agent_id: AGENT, name: CHANNEL },
|
|
30
|
-
};
|
|
31
|
-
}).sort((a, b) => (BigInt(a.id) < BigInt(b.id) ? -1 : 1));
|
|
32
|
-
/**
|
|
33
|
-
* Emulates the REST route's *native* ordering, which the SDK client then
|
|
34
|
-
* reverses per `order`: `before` returns the newest N below the cursor,
|
|
35
|
-
* newest-first; a bare `after` returns the oldest N above it, oldest-first.
|
|
36
|
-
*/
|
|
37
|
-
function serveNative(query) {
|
|
38
|
-
const before = query.get("before");
|
|
39
|
-
const after = query.get("after");
|
|
40
|
-
const limit = Number(query.get("limit") ?? "10");
|
|
41
|
-
if (before && !after) {
|
|
42
|
-
const below = ALL.filter((m) => BigInt(m.id) < BigInt(before));
|
|
43
|
-
return below.slice(Math.max(0, below.length - limit)).reverse(); // newest-first
|
|
44
|
-
}
|
|
45
|
-
if (after && !before) {
|
|
46
|
-
const above = ALL.filter((m) => BigInt(m.id) > BigInt(after));
|
|
47
|
-
return above.slice(0, limit); // oldest-first
|
|
48
|
-
}
|
|
49
|
-
// both bounds: newest-first within (after, before]
|
|
50
|
-
const within = ALL.filter((m) => BigInt(m.id) < BigInt(before) && BigInt(m.id) > BigInt(after));
|
|
51
|
-
return within.slice(Math.max(0, within.length - limit)).reverse();
|
|
52
|
-
}
|
|
53
|
-
function makeClient() {
|
|
54
|
-
const calls = [];
|
|
55
|
-
const fetchMock = sinon_1.default.stub().callsFake(async (input) => {
|
|
56
|
-
const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
57
|
-
if (url.includes("/messages")) {
|
|
58
|
-
const q = new URL(url).searchParams;
|
|
59
|
-
calls.push(q);
|
|
60
|
-
return (0, helpers_1.createJsonResponse)(serveNative(q));
|
|
61
|
-
}
|
|
62
|
-
return (0, helpers_1.createJsonResponse)({});
|
|
63
|
-
});
|
|
64
|
-
const client = new doover_client_1.DooverClient({
|
|
65
|
-
dataRestUrl: "https://api.example.com",
|
|
66
|
-
controlApiUrl: "https://control.example.com",
|
|
67
|
-
dataWssUrl: "wss://ws.example.com",
|
|
68
|
-
fetchImpl: fetchMock,
|
|
69
|
-
webSocketImpl: helpers_1.MockWebSocket,
|
|
70
|
-
disableBrowserLifecycleHooks: true,
|
|
71
|
-
});
|
|
72
|
-
return { client, calls };
|
|
73
|
-
}
|
|
74
|
-
function wrapper(client, queryClient) {
|
|
75
|
-
return function Wrapper({ children }) {
|
|
76
|
-
return ((0, jsx_runtime_1.jsx)(react_query_1.QueryClientProvider, { client: queryClient, children: (0, jsx_runtime_1.jsx)(react_2.DooverProvider, { client: client, children: children }) }));
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
const newQueryClient = () => new react_query_1.QueryClient({ defaultOptions: { queries: { retry: false } } });
|
|
80
|
-
const idAtIndex = (i) => ALL[i].id;
|
|
81
|
-
const timeOfIndex = (i) => NOW - (COUNT - 1 - i) * 60000;
|
|
82
|
-
/** A snowflake landing strictly between messages i and i+1 (30s after i). */
|
|
83
|
-
const anchorAfter = (i) => (0, snowflake_1.generateSnowflakeIdAtTime)(new Date(timeOfIndex(i) + 30000));
|
|
84
|
-
(0, mocha_1.describe)("useChannelMessages forward pagination", () => {
|
|
85
|
-
(0, mocha_1.beforeEach)(() => {
|
|
86
|
-
(0, helpers_1.installSessionStorageMock)();
|
|
87
|
-
(0, messageRangeStore_1.resetChannelRangeStores)();
|
|
88
|
-
});
|
|
89
|
-
(0, mocha_1.afterEach)(() => {
|
|
90
|
-
sinon_1.default.restore();
|
|
91
|
-
});
|
|
92
|
-
(0, mocha_1.it)("pages forward from an anchor into newer messages", async () => {
|
|
93
|
-
const { client } = makeClient();
|
|
94
|
-
const qc = newQueryClient();
|
|
95
|
-
// Anchor between index 29 and 30 — half the history is newer than it.
|
|
96
|
-
const anchor = anchorAfter(29);
|
|
97
|
-
const { result } = (0, react_1.renderHook)(() => (0, react_2.useChannelMessages)({ agentId: AGENT, channelName: CHANNEL }, { limit: 10, anchor }), { wrapper: wrapper(client, qc) });
|
|
98
|
-
await (0, react_1.waitFor)(() => (0, chai_1.expect)(result.current.messages).to.have.length(10));
|
|
99
|
-
// The anchored page is the 10 newest *below* the anchor: indices 20..29.
|
|
100
|
-
(0, chai_1.expect)(result.current.messages.every((m) => BigInt(m.id) < BigInt(anchor))).to.equal(true);
|
|
101
|
-
(0, chai_1.expect)(result.current.hasPreviousPage).to.equal(true);
|
|
102
|
-
await (0, react_1.act)(async () => {
|
|
103
|
-
await result.current.fetchPreviousPage();
|
|
104
|
-
});
|
|
105
|
-
await (0, react_1.waitFor)(() => (0, chai_1.expect)(result.current.messages.some((m) => BigInt(m.id) > BigInt(anchor))).to.equal(true));
|
|
106
|
-
// Forward page brought in the messages immediately above the anchor (index 30+).
|
|
107
|
-
(0, chai_1.expect)(result.current.messages.map((m) => m.data).some((d) => d.i >= 30)).to.equal(true);
|
|
108
|
-
});
|
|
109
|
-
(0, mocha_1.it)("exposes no previous page for an unanchored (live) window", async () => {
|
|
110
|
-
const { client } = makeClient();
|
|
111
|
-
const qc = newQueryClient();
|
|
112
|
-
const { result } = (0, react_1.renderHook)(() => (0, react_2.useChannelMessages)({ agentId: AGENT, channelName: CHANNEL }, { limit: 10 }), { wrapper: wrapper(client, qc) });
|
|
113
|
-
await (0, react_1.waitFor)(() => (0, chai_1.expect)(result.current.messages).to.have.length(10));
|
|
114
|
-
(0, chai_1.expect)(result.current.hasPreviousPage).to.equal(false);
|
|
115
|
-
});
|
|
116
|
-
(0, mocha_1.it)("recovers messages above an anchor that has nothing below it, and terminates", async () => {
|
|
117
|
-
const { client } = makeClient();
|
|
118
|
-
const qc = newQueryClient();
|
|
119
|
-
// Anchor older than every message: the initial before=anchor page is empty.
|
|
120
|
-
const anchor = (0, snowflake_1.generateSnowflakeIdAtTime)(new Date(NOW - COUNT * 10 * 60000));
|
|
121
|
-
const { result } = (0, react_1.renderHook)(() => (0, react_2.useChannelMessages)({ agentId: AGENT, channelName: CHANNEL }, { limit: 10, anchor }), { wrapper: wrapper(client, qc) });
|
|
122
|
-
await (0, react_1.waitFor)(() => (0, chai_1.expect)(result.current.isLoading).to.equal(false));
|
|
123
|
-
(0, chai_1.expect)(result.current.messages).to.have.length(0);
|
|
124
|
-
// Empty below, but the walk still seeds from the anchor itself.
|
|
125
|
-
(0, chai_1.expect)(result.current.hasPreviousPage).to.equal(true);
|
|
126
|
-
// Drain forward until exhausted — must terminate, never loop.
|
|
127
|
-
for (let guard = 0; guard < 20 && result.current.hasPreviousPage; guard++) {
|
|
128
|
-
await (0, react_1.act)(async () => {
|
|
129
|
-
await result.current.fetchPreviousPage();
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
(0, chai_1.expect)(result.current.hasPreviousPage).to.equal(false);
|
|
133
|
-
// Every message above the anchor is recovered (order is the consumer's job).
|
|
134
|
-
const ids = result.current.messages.map((m) => m.id);
|
|
135
|
-
(0, chai_1.expect)(ids).to.have.length(COUNT);
|
|
136
|
-
(0, chai_1.expect)(ids).to.include(idAtIndex(0));
|
|
137
|
-
(0, chai_1.expect)(ids).to.include(idAtIndex(COUNT - 1));
|
|
138
|
-
});
|
|
139
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|