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,95 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const chai_1 = require("chai");
|
|
4
|
-
const gateway_client_1 = require("../gateway/gateway-client");
|
|
5
|
-
function makeConfig() {
|
|
6
|
-
return {
|
|
7
|
-
dataRestUrl: "https://example.com/api",
|
|
8
|
-
controlApiUrl: "https://example.com/control",
|
|
9
|
-
dataWssUrl: "wss://example.com/gateway",
|
|
10
|
-
disableBrowserLifecycleHooks: true,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
function fakeMessage(channel = { agent_id: "a1", name: "c1" }, id = "m1") {
|
|
14
|
-
return {
|
|
15
|
-
id,
|
|
16
|
-
data: {},
|
|
17
|
-
attachments: [],
|
|
18
|
-
author_id: "auth",
|
|
19
|
-
channel,
|
|
20
|
-
timestamp: 1,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
describe("GatewayClient.subscribeToChannel", () => {
|
|
24
|
-
it("first handler triggers wire-level subscribe", () => {
|
|
25
|
-
const gw = new gateway_client_1.GatewayClient(makeConfig());
|
|
26
|
-
let subscribeCalls = 0;
|
|
27
|
-
gw.subscribe = () => {
|
|
28
|
-
subscribeCalls += 1;
|
|
29
|
-
};
|
|
30
|
-
gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
|
|
31
|
-
(0, chai_1.expect)(subscribeCalls).to.equal(1);
|
|
32
|
-
});
|
|
33
|
-
it("second handler does not trigger another wire-level subscribe", () => {
|
|
34
|
-
const gw = new gateway_client_1.GatewayClient(makeConfig());
|
|
35
|
-
let subscribeCalls = 0;
|
|
36
|
-
gw.subscribe = () => {
|
|
37
|
-
subscribeCalls += 1;
|
|
38
|
-
};
|
|
39
|
-
gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
|
|
40
|
-
gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
|
|
41
|
-
(0, chai_1.expect)(subscribeCalls).to.equal(1);
|
|
42
|
-
});
|
|
43
|
-
it("returned unsubscribe drops the handler; last drop unsubscribes", () => {
|
|
44
|
-
const gw = new gateway_client_1.GatewayClient(makeConfig());
|
|
45
|
-
let unsubCalls = 0;
|
|
46
|
-
gw.subscribe = () => { };
|
|
47
|
-
gw.unsubscribe = () => {
|
|
48
|
-
unsubCalls += 1;
|
|
49
|
-
};
|
|
50
|
-
const off1 = gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
|
|
51
|
-
const off2 = gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
|
|
52
|
-
off1();
|
|
53
|
-
(0, chai_1.expect)(unsubCalls).to.equal(0);
|
|
54
|
-
off2();
|
|
55
|
-
(0, chai_1.expect)(unsubCalls).to.equal(1);
|
|
56
|
-
});
|
|
57
|
-
it("returned unsubscribe is idempotent", () => {
|
|
58
|
-
const gw = new gateway_client_1.GatewayClient(makeConfig());
|
|
59
|
-
let unsubCalls = 0;
|
|
60
|
-
gw.subscribe = () => { };
|
|
61
|
-
gw.unsubscribe = () => {
|
|
62
|
-
unsubCalls += 1;
|
|
63
|
-
};
|
|
64
|
-
const off = gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
|
|
65
|
-
off();
|
|
66
|
-
off();
|
|
67
|
-
off();
|
|
68
|
-
(0, chai_1.expect)(unsubCalls).to.equal(1);
|
|
69
|
-
});
|
|
70
|
-
it("messageCreate event fans out to onMessage handlers for the matching channel", () => {
|
|
71
|
-
const gw = new gateway_client_1.GatewayClient(makeConfig());
|
|
72
|
-
gw.subscribe = () => { };
|
|
73
|
-
let received;
|
|
74
|
-
gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: (m) => { received = m; } });
|
|
75
|
-
gw.emit("messageCreate", fakeMessage());
|
|
76
|
-
(0, chai_1.expect)(received?.id).to.equal("m1");
|
|
77
|
-
});
|
|
78
|
-
it("messageCreate for a different channel does not fire the handler", () => {
|
|
79
|
-
const gw = new gateway_client_1.GatewayClient(makeConfig());
|
|
80
|
-
gw.subscribe = () => { };
|
|
81
|
-
let received = false;
|
|
82
|
-
gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { received = true; } });
|
|
83
|
-
gw.emit("messageCreate", fakeMessage({ agent_id: "a1", name: "c2" }, "m2"));
|
|
84
|
-
(0, chai_1.expect)(received).to.equal(false);
|
|
85
|
-
});
|
|
86
|
-
it("aggregateUpdate fans out to onAggregate handlers", () => {
|
|
87
|
-
const gw = new gateway_client_1.GatewayClient(makeConfig());
|
|
88
|
-
gw.subscribe = () => { };
|
|
89
|
-
let received;
|
|
90
|
-
gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onAggregate: (a) => { received = a; } });
|
|
91
|
-
const aggregate = { data: { x: 1 }, attachments: [] };
|
|
92
|
-
gw.emit("aggregateUpdate", { channel: { agent_id: "a1", name: "c1" }, aggregate });
|
|
93
|
-
(0, chai_1.expect)(received?.data).to.deep.equal({ x: 1 });
|
|
94
|
-
});
|
|
95
|
-
});
|
package/dist/test/helpers.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import sinon from "sinon";
|
|
2
|
-
export declare function createJsonResponse(body: unknown, init?: ResponseInit): Response;
|
|
3
|
-
export declare function createTextResponse(body: string, init?: ResponseInit): Response;
|
|
4
|
-
export declare function createBlobResponse(body: string, init?: ResponseInit): Response;
|
|
5
|
-
export declare function createFetchMock(responseFactory?: (url: string, init?: RequestInit) => Response | Promise<Response>): sinon.SinonStub<any[], any>;
|
|
6
|
-
export declare function installSessionStorageMock(): void;
|
|
7
|
-
type MessageHandler = ((event: MessageEvent<string>) => void) | null;
|
|
8
|
-
type CloseHandler = ((event: CloseEvent) => void) | null;
|
|
9
|
-
type OpenHandler = (() => void) | null;
|
|
10
|
-
type ErrorHandler = ((event: Event) => void) | null;
|
|
11
|
-
export declare class MockWebSocket {
|
|
12
|
-
static instances: MockWebSocket[];
|
|
13
|
-
static CONNECTING: number;
|
|
14
|
-
static OPEN: number;
|
|
15
|
-
static CLOSING: number;
|
|
16
|
-
static CLOSED: number;
|
|
17
|
-
readonly url: string;
|
|
18
|
-
readyState: number;
|
|
19
|
-
sent: string[];
|
|
20
|
-
onmessage: MessageHandler;
|
|
21
|
-
onclose: CloseHandler;
|
|
22
|
-
onopen: OpenHandler;
|
|
23
|
-
onerror: ErrorHandler;
|
|
24
|
-
constructor(url: string);
|
|
25
|
-
send(data: string): void;
|
|
26
|
-
close(code?: number, reason?: string): void;
|
|
27
|
-
open(): void;
|
|
28
|
-
receive(payload: unknown): void;
|
|
29
|
-
error(): void;
|
|
30
|
-
static reset(): void;
|
|
31
|
-
}
|
|
32
|
-
export {};
|
package/dist/test/helpers.js
DELETED
|
@@ -1,115 +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
|
-
exports.MockWebSocket = void 0;
|
|
7
|
-
exports.createJsonResponse = createJsonResponse;
|
|
8
|
-
exports.createTextResponse = createTextResponse;
|
|
9
|
-
exports.createBlobResponse = createBlobResponse;
|
|
10
|
-
exports.createFetchMock = createFetchMock;
|
|
11
|
-
exports.installSessionStorageMock = installSessionStorageMock;
|
|
12
|
-
const sinon_1 = __importDefault(require("sinon"));
|
|
13
|
-
function createJsonResponse(body, init) {
|
|
14
|
-
return new Response(JSON.stringify(body), {
|
|
15
|
-
status: init?.status ?? 200,
|
|
16
|
-
headers: {
|
|
17
|
-
"content-type": "application/json",
|
|
18
|
-
...(init?.headers ?? {}),
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
function createTextResponse(body, init) {
|
|
23
|
-
return new Response(body, {
|
|
24
|
-
status: init?.status ?? 200,
|
|
25
|
-
headers: init?.headers,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
function createBlobResponse(body, init) {
|
|
29
|
-
return new Response(new Blob([body]), {
|
|
30
|
-
status: init?.status ?? 200,
|
|
31
|
-
headers: {
|
|
32
|
-
"content-type": "application/octet-stream",
|
|
33
|
-
...(init?.headers ?? {}),
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
function createFetchMock(responseFactory) {
|
|
38
|
-
return sinon_1.default.stub().callsFake(async (input, init) => {
|
|
39
|
-
const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
40
|
-
if (responseFactory) {
|
|
41
|
-
return responseFactory(url, init);
|
|
42
|
-
}
|
|
43
|
-
return createJsonResponse({ ok: true });
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
class StorageMock {
|
|
47
|
-
constructor() {
|
|
48
|
-
this.store = new Map();
|
|
49
|
-
}
|
|
50
|
-
get length() {
|
|
51
|
-
return this.store.size;
|
|
52
|
-
}
|
|
53
|
-
clear() {
|
|
54
|
-
this.store.clear();
|
|
55
|
-
}
|
|
56
|
-
getItem(key) {
|
|
57
|
-
return this.store.get(key) ?? null;
|
|
58
|
-
}
|
|
59
|
-
key(index) {
|
|
60
|
-
return Array.from(this.store.keys())[index] ?? null;
|
|
61
|
-
}
|
|
62
|
-
removeItem(key) {
|
|
63
|
-
this.store.delete(key);
|
|
64
|
-
}
|
|
65
|
-
setItem(key, value) {
|
|
66
|
-
this.store.set(key, value);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function installSessionStorageMock() {
|
|
70
|
-
Object.defineProperty(globalThis, "sessionStorage", {
|
|
71
|
-
value: new StorageMock(),
|
|
72
|
-
configurable: true,
|
|
73
|
-
writable: true,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
class MockWebSocket {
|
|
77
|
-
constructor(url) {
|
|
78
|
-
this.readyState = MockWebSocket.CONNECTING;
|
|
79
|
-
this.sent = [];
|
|
80
|
-
this.onmessage = null;
|
|
81
|
-
this.onclose = null;
|
|
82
|
-
this.onopen = null;
|
|
83
|
-
this.onerror = null;
|
|
84
|
-
this.url = url;
|
|
85
|
-
MockWebSocket.instances.push(this);
|
|
86
|
-
}
|
|
87
|
-
send(data) {
|
|
88
|
-
this.sent.push(data);
|
|
89
|
-
}
|
|
90
|
-
close(code, reason) {
|
|
91
|
-
this.readyState = MockWebSocket.CLOSED;
|
|
92
|
-
this.onclose?.({ code: code ?? 1000, reason: reason ?? "" });
|
|
93
|
-
}
|
|
94
|
-
open() {
|
|
95
|
-
this.readyState = MockWebSocket.OPEN;
|
|
96
|
-
this.onopen?.();
|
|
97
|
-
}
|
|
98
|
-
receive(payload) {
|
|
99
|
-
this.onmessage?.(new MessageEvent("message", {
|
|
100
|
-
data: JSON.stringify(payload),
|
|
101
|
-
}));
|
|
102
|
-
}
|
|
103
|
-
error() {
|
|
104
|
-
this.onerror?.(new Event("error"));
|
|
105
|
-
}
|
|
106
|
-
static reset() {
|
|
107
|
-
MockWebSocket.instances = [];
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
exports.MockWebSocket = MockWebSocket;
|
|
111
|
-
MockWebSocket.instances = [];
|
|
112
|
-
MockWebSocket.CONNECTING = 0;
|
|
113
|
-
MockWebSocket.OPEN = 1;
|
|
114
|
-
MockWebSocket.CLOSING = 2;
|
|
115
|
-
MockWebSocket.CLOSED = 3;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,202 +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
|
-
const chai_1 = require("chai");
|
|
40
|
-
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
41
|
-
const chai = __importStar(require("chai"));
|
|
42
|
-
const mocha_1 = require("mocha");
|
|
43
|
-
const local_agent_client_1 = require("../client/local-agent-client");
|
|
44
|
-
const errors_1 = require("../client/errors");
|
|
45
|
-
const helpers_1 = require("./helpers");
|
|
46
|
-
// Valid snowflake IDs for use in mock payloads (id must be a numeric string for BigInt conversion).
|
|
47
|
-
const SNOWFLAKE_1 = "179418309739937792";
|
|
48
|
-
const SNOWFLAKE_2 = "179418309744132096";
|
|
49
|
-
chai.use(chai_as_promised_1.default);
|
|
50
|
-
const { expect: xpect } = chai;
|
|
51
|
-
function makeLocal(extra = {}) {
|
|
52
|
-
return new local_agent_client_1.LocalAgentClient({
|
|
53
|
-
baseUrl: "http://192.168.0.7:49100",
|
|
54
|
-
fetchImpl: (0, helpers_1.createFetchMock)(),
|
|
55
|
-
webSocketImpl: helpers_1.MockWebSocket,
|
|
56
|
-
disableBrowserLifecycleHooks: true,
|
|
57
|
-
sourceId: "local:192.168.0.7:49100",
|
|
58
|
-
...extra,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
(0, mocha_1.describe)("LocalAgentClient", () => {
|
|
62
|
-
(0, mocha_1.it)("advertises the v1 capability set and not the others", () => {
|
|
63
|
-
const caps = makeLocal().getCapabilities();
|
|
64
|
-
for (const c of ["agents.list", "channels.list", "channels.get", "aggregates.get",
|
|
65
|
-
"aggregates.put", "aggregates.patch", "messages.list", "messages.post", "messages.put",
|
|
66
|
-
"gateway.subscribe", "gateway.realtime", "gateway.oneShot"]) {
|
|
67
|
-
(0, chai_1.expect)(caps.has(c)).to.equal(true);
|
|
68
|
-
}
|
|
69
|
-
for (const c of ["messages.listHistorical", "messages.get", "channels.create",
|
|
70
|
-
"channels.archive", "rpc.send", "users.me", "alarms.read"]) {
|
|
71
|
-
(0, chai_1.expect)(caps.has(c)).to.equal(false);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
(0, mocha_1.it)("throw-stubs every unadvertised method with UnsupportedCapabilityError", async () => {
|
|
75
|
-
const c = makeLocal();
|
|
76
|
-
await xpect(c.messages.getMessage("a", "ch", "m")).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
|
|
77
|
-
await xpect(c.channels.createChannel("a", "ch", {})).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
|
|
78
|
-
await xpect(c.users.getMe()).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
|
|
79
|
-
await xpect(c.rpc.send({ agentId: "a", channelName: "ch" }, { method: "x", request: {} })).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
|
|
80
|
-
try {
|
|
81
|
-
await c.alarms.listAlarms("a", "ch");
|
|
82
|
-
chai_1.expect.fail("should throw");
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
(0, chai_1.expect)(e).to.be.instanceOf(errors_1.UnsupportedCapabilityError);
|
|
86
|
-
(0, chai_1.expect)(e.capability).to.equal("alarms.read");
|
|
87
|
-
(0, chai_1.expect)(e.clientId).to.equal("local:192.168.0.7:49100");
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
(0, mocha_1.it)("listChannels / getChannel / getAggregate / listMessages hit the local REST base and carry __source kind 'local'", async () => {
|
|
91
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
92
|
-
if (url.endsWith("/channels"))
|
|
93
|
-
return (0, helpers_1.createJsonResponse)([{ name: "c1", is_private: false, owner_id: "o" }]);
|
|
94
|
-
if (url.includes("/channels/c1/aggregate"))
|
|
95
|
-
return (0, helpers_1.createJsonResponse)({ data: { v: 1 }, attachments: [] });
|
|
96
|
-
if (url.includes("/channels/c1/messages"))
|
|
97
|
-
return (0, helpers_1.createJsonResponse)([{ id: SNOWFLAKE_1, data: {}, attachments: [], author_id: "a", channel: { agent_id: "dev7", name: "c1" } }]);
|
|
98
|
-
if (url.includes("/channels/c1"))
|
|
99
|
-
return (0, helpers_1.createJsonResponse)({ name: "c1", is_private: false, owner_id: "o" });
|
|
100
|
-
return (0, helpers_1.createJsonResponse)({});
|
|
101
|
-
});
|
|
102
|
-
const c = makeLocal({ fetchImpl: fetchMock });
|
|
103
|
-
const list = await c.channels.listChannels("dev7");
|
|
104
|
-
(0, chai_1.expect)(list[0].__source?.client.kind).to.equal("local");
|
|
105
|
-
(0, chai_1.expect)(list[0].__source?.via).to.include({ transport: "rest", method: "channels.listChannels" });
|
|
106
|
-
const agg = await c.aggregates.getAggregate("dev7", "c1");
|
|
107
|
-
(0, chai_1.expect)(agg.__source?.client.id).to.equal("local:192.168.0.7:49100");
|
|
108
|
-
const msgs = await c.messages.listMessages("dev7", "c1");
|
|
109
|
-
(0, chai_1.expect)(msgs[0].__source?.via).to.include({ transport: "rest" });
|
|
110
|
-
});
|
|
111
|
-
(0, mocha_1.it)("postMessage / putMessage / putAggregate / patchAggregate go through to the local REST base", async () => {
|
|
112
|
-
const seen = [];
|
|
113
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url, init) => {
|
|
114
|
-
seen.push({ method: init?.method, url });
|
|
115
|
-
if (url.includes("/messages"))
|
|
116
|
-
return (0, helpers_1.createJsonResponse)({ id: SNOWFLAKE_2, data: {}, attachments: [], author_id: "a", channel: { agent_id: "dev7", name: "c1" } });
|
|
117
|
-
return (0, helpers_1.createJsonResponse)({ data: {}, attachments: [] });
|
|
118
|
-
});
|
|
119
|
-
const c = makeLocal({ fetchImpl: fetchMock });
|
|
120
|
-
const m = await c.messages.postMessage("dev7", "c1", { hello: 1 });
|
|
121
|
-
(0, chai_1.expect)(m.__source?.client.kind).to.equal("local");
|
|
122
|
-
await c.aggregates.putAggregate("dev7", "c1", { v: 2 });
|
|
123
|
-
await c.aggregates.patchAggregate("dev7", "c1", { v: 3 });
|
|
124
|
-
await c.messages.putMessage("dev7", "c1", SNOWFLAKE_2, { v: 4 });
|
|
125
|
-
(0, chai_1.expect)(seen.some((s) => s.method === "POST" && s.url.includes("/messages"))).to.equal(true);
|
|
126
|
-
(0, chai_1.expect)(seen.some((s) => s.method === "PUT" && s.url.includes("/aggregate"))).to.equal(true);
|
|
127
|
-
(0, chai_1.expect)(seen.some((s) => s.method === "PATCH" && s.url.includes("/aggregate"))).to.equal(true);
|
|
128
|
-
});
|
|
129
|
-
(0, mocha_1.it)("status reflects the local gateway: disconnected before connect, connected after Ready", async () => {
|
|
130
|
-
const c = makeLocal();
|
|
131
|
-
(0, chai_1.expect)(c.isConnected()).to.equal(false);
|
|
132
|
-
(0, chai_1.expect)(c.getStatus().state).to.equal("disconnected");
|
|
133
|
-
await c.gateway.connect();
|
|
134
|
-
const ws = helpers_1.MockWebSocket.instances[helpers_1.MockWebSocket.instances.length - 1];
|
|
135
|
-
ws.open();
|
|
136
|
-
ws.receive({ op: 0, t: "Hello", d: {} });
|
|
137
|
-
ws.receive({ op: 0, t: "Ready", d: { session_id: "s1", session_token: "t", subscriptions: [] } });
|
|
138
|
-
(0, chai_1.expect)(c.isConnected()).to.equal(true);
|
|
139
|
-
(0, chai_1.expect)(c.getStatus().state).to.equal("connected");
|
|
140
|
-
(0, chai_1.expect)(c.getStatus().clientId).to.equal("local:192.168.0.7:49100");
|
|
141
|
-
});
|
|
142
|
-
(0, mocha_1.it)("realtime: subscribeToChannel handlers receive stamped MessageCreate", async () => {
|
|
143
|
-
const c = makeLocal();
|
|
144
|
-
await c.gateway.connect();
|
|
145
|
-
const ws = helpers_1.MockWebSocket.instances[helpers_1.MockWebSocket.instances.length - 1];
|
|
146
|
-
ws.open();
|
|
147
|
-
ws.receive({ op: 0, t: "Ready", d: { session_id: "s1", session_token: "t", subscriptions: [] } });
|
|
148
|
-
let got;
|
|
149
|
-
c.gateway.subscribeToChannel({ agent_id: "dev7", name: "c1" }, { onMessage: (m) => { got = m; } });
|
|
150
|
-
ws.receive({ op: 0, t: "MessageCreate", d: { id: SNOWFLAKE_1, data: {}, attachments: [], author_id: "a", channel: { agent_id: "dev7", name: "c1" } } });
|
|
151
|
-
(0, chai_1.expect)(got.__source?.client.kind).to.equal("local");
|
|
152
|
-
});
|
|
153
|
-
(0, mocha_1.it)("getAgentScope resolves to { mode: 'list', agentIds: [deviceId] } via listAgents, caches it, and getKnownAgentScope is 'unknown' first", async () => {
|
|
154
|
-
let agentCalls = 0;
|
|
155
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
156
|
-
if (url.includes("/agents")) {
|
|
157
|
-
agentCalls += 1;
|
|
158
|
-
return (0, helpers_1.createJsonResponse)({ agents: [{ id: "dev7", name: "Device 7" }] });
|
|
159
|
-
}
|
|
160
|
-
return (0, helpers_1.createJsonResponse)({});
|
|
161
|
-
});
|
|
162
|
-
const c = makeLocal({ fetchImpl: fetchMock });
|
|
163
|
-
(0, chai_1.expect)(c.getKnownAgentScope()).to.equal("unknown");
|
|
164
|
-
const scope = await c.getAgentScope();
|
|
165
|
-
(0, chai_1.expect)(scope).to.deep.equal({ mode: "list", agentIds: ["dev7"] });
|
|
166
|
-
(0, chai_1.expect)(c.getKnownAgentScope()).to.deep.equal({ mode: "list", agentIds: ["dev7"] });
|
|
167
|
-
await c.getAgentScope(); // cached
|
|
168
|
-
(0, chai_1.expect)(agentCalls).to.equal(1);
|
|
169
|
-
});
|
|
170
|
-
(0, mocha_1.it)("reconnect (Ready frame) invalidates the scope cache and re-fetches the agent id", async () => {
|
|
171
|
-
let agentCalls = 0;
|
|
172
|
-
const fetchMock = (0, helpers_1.createFetchMock)((url) => {
|
|
173
|
-
if (url.includes("/agents")) {
|
|
174
|
-
agentCalls += 1;
|
|
175
|
-
return (0, helpers_1.createJsonResponse)({ agents: [{ id: "dev7", name: "Device 7" }] });
|
|
176
|
-
}
|
|
177
|
-
return (0, helpers_1.createJsonResponse)({});
|
|
178
|
-
});
|
|
179
|
-
const c = makeLocal({ fetchImpl: fetchMock });
|
|
180
|
-
// 1. Initial resolve — agentCalls becomes 1, scope is cached.
|
|
181
|
-
const scope1 = await c.getAgentScope();
|
|
182
|
-
(0, chai_1.expect)(scope1).to.deep.equal({ mode: "list", agentIds: ["dev7"] });
|
|
183
|
-
(0, chai_1.expect)(agentCalls).to.equal(1);
|
|
184
|
-
// 2. Connect the gateway, open the socket, and send a Ready frame — this
|
|
185
|
-
// should null the cache and kick off a background re-fetch.
|
|
186
|
-
await c.gateway.connect();
|
|
187
|
-
const ws = helpers_1.MockWebSocket.instances[helpers_1.MockWebSocket.instances.length - 1];
|
|
188
|
-
ws.open();
|
|
189
|
-
ws.receive({ op: 0, t: "Hello", d: {} });
|
|
190
|
-
ws.receive({ op: 0, t: "Ready", d: { session_id: "s2", session_token: "t2", subscriptions: [] } });
|
|
191
|
-
// 3. The "ready" handler fires synchronously, nulling resolvedScope and
|
|
192
|
-
// firing off an async re-fetch. Flush the microtask queue so the async
|
|
193
|
-
// listAgents() call has time to complete before we assert.
|
|
194
|
-
await new Promise((r) => setImmediate(r));
|
|
195
|
-
await new Promise((r) => setImmediate(r));
|
|
196
|
-
// 4. Re-fetch should have run: agentCalls === 2 and scope is still [dev7].
|
|
197
|
-
(0, chai_1.expect)(agentCalls).to.equal(2);
|
|
198
|
-
const scope2 = await c.getAgentScope(); // now served from refreshed cache
|
|
199
|
-
(0, chai_1.expect)(scope2).to.deep.equal({ mode: "list", agentIds: ["dev7"] });
|
|
200
|
-
(0, chai_1.expect)(agentCalls).to.equal(2); // no third fetch — cache hit
|
|
201
|
-
});
|
|
202
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,183 +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 messageRangeStore_1 = require("../react/messageRangeStore");
|
|
6
|
-
const snowflake_1 = require("../utils/snowflake");
|
|
7
|
-
/** Frozen so a cursor built twice is the same cursor — real clocks make these flaky. */
|
|
8
|
-
const NOW = Date.now();
|
|
9
|
-
/** Messages at 1-minute spacing, oldest first, ending `minutesAgo` before NOW. */
|
|
10
|
-
function makeMessages(count, startMinutesAgo) {
|
|
11
|
-
return Array.from({ length: count }, (_, i) => {
|
|
12
|
-
const at = new Date(NOW - (startMinutesAgo - i) * 60000);
|
|
13
|
-
return {
|
|
14
|
-
id: (0, snowflake_1.generateSnowflakeIdAtTime)(at),
|
|
15
|
-
data: { i },
|
|
16
|
-
attachments: [],
|
|
17
|
-
author_id: "a",
|
|
18
|
-
channel: { agentId: "agent", channelName: "chan" },
|
|
19
|
-
timestamp: at.getTime(),
|
|
20
|
-
};
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
const idAt = (minutesAgo) => BigInt((0, snowflake_1.generateSnowflakeIdAtTime)(new Date(NOW - minutesAgo * 60000)));
|
|
24
|
-
const ids = (messages) => (messages ?? []).map((m) => m.id);
|
|
25
|
-
(0, mocha_1.describe)("ChannelRangeStore", () => {
|
|
26
|
-
let store;
|
|
27
|
-
(0, mocha_1.beforeEach)(() => {
|
|
28
|
-
store = new messageRangeStore_1.ChannelRangeStore();
|
|
29
|
-
});
|
|
30
|
-
(0, mocha_1.it)("returns undefined for a range it has never seen", () => {
|
|
31
|
-
(0, chai_1.expect)(store.read(idAt(0), 10)).to.equal(undefined);
|
|
32
|
-
});
|
|
33
|
-
(0, mocha_1.it)("serves a full page back from cache", () => {
|
|
34
|
-
const page = makeMessages(10, 20);
|
|
35
|
-
store.record({ before: idAt(0), limit: 10, page });
|
|
36
|
-
const read = store.read(idAt(0), 10);
|
|
37
|
-
(0, chai_1.expect)(ids(read)).to.deep.equal(ids(page));
|
|
38
|
-
});
|
|
39
|
-
(0, mocha_1.it)("returns messages ascending, matching order:asc", () => {
|
|
40
|
-
const page = makeMessages(5, 20);
|
|
41
|
-
store.record({ before: idAt(0), limit: 5, page });
|
|
42
|
-
const read = store.read(idAt(0), 5);
|
|
43
|
-
for (let i = 1; i < read.length; i++) {
|
|
44
|
-
(0, chai_1.expect)(BigInt(read[i].id) > BigInt(read[i - 1].id)).to.equal(true);
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
(0, mocha_1.it)("serves the NEWEST `limit` older than the cursor, not the first", () => {
|
|
48
|
-
const page = makeMessages(10, 20); // 20..11 minutes ago
|
|
49
|
-
store.record({ before: idAt(0), limit: 10, page });
|
|
50
|
-
const read = store.read(idAt(0), 3);
|
|
51
|
-
(0, chai_1.expect)(ids(read)).to.deep.equal(ids(page.slice(7)));
|
|
52
|
-
});
|
|
53
|
-
(0, mocha_1.it)("excludes the cursor message itself (`before` is exclusive)", () => {
|
|
54
|
-
const page = makeMessages(5, 20);
|
|
55
|
-
store.record({ before: idAt(0), limit: 5, page });
|
|
56
|
-
// Only 2 messages sit below page[2], so asking for more would (rightly) be
|
|
57
|
-
// unanswerable — nothing proves what lies below the segment's `lo`.
|
|
58
|
-
const cursor = BigInt(page[2].id);
|
|
59
|
-
const read = store.read(cursor, 2);
|
|
60
|
-
(0, chai_1.expect)(read.every((m) => BigInt(m.id) < cursor)).to.equal(true);
|
|
61
|
-
(0, chai_1.expect)(ids(read)).to.deep.equal(ids(page.slice(0, 2)));
|
|
62
|
-
});
|
|
63
|
-
(0, mocha_1.it)("will not answer beyond what it has proven", () => {
|
|
64
|
-
const page = makeMessages(10, 20);
|
|
65
|
-
store.record({ before: idAt(0), limit: 10, page });
|
|
66
|
-
// Holds 10, asked for 20, and nothing says the range bottoms out here
|
|
67
|
-
(0, chai_1.expect)(store.read(idAt(0), 20)).to.equal(undefined);
|
|
68
|
-
});
|
|
69
|
-
(0, mocha_1.it)("answers short when a short page proved the range bottoms out", () => {
|
|
70
|
-
const page = makeMessages(3, 20);
|
|
71
|
-
store.record({ before: idAt(0), limit: 10, page }); // 3 < 10 => atStart
|
|
72
|
-
const read = store.read(idAt(0), 10);
|
|
73
|
-
(0, chai_1.expect)(ids(read)).to.deep.equal(ids(page));
|
|
74
|
-
});
|
|
75
|
-
(0, mocha_1.it)("will not answer a cursor above its proven upper bound", () => {
|
|
76
|
-
const page = makeMessages(10, 20);
|
|
77
|
-
store.record({ before: idAt(10), limit: 10, page });
|
|
78
|
-
// Nothing proves what sits between 10 minutes ago and now
|
|
79
|
-
(0, chai_1.expect)(store.read(idAt(0), 5)).to.equal(undefined);
|
|
80
|
-
});
|
|
81
|
-
(0, mocha_1.it)("merges touching ranges so a later read spans both", () => {
|
|
82
|
-
const older = makeMessages(10, 40); // 40..31
|
|
83
|
-
const newer = makeMessages(10, 20); // 20..11
|
|
84
|
-
store.record({ before: idAt(0), limit: 10, page: newer });
|
|
85
|
-
// Paging older: cursor is the oldest we held
|
|
86
|
-
store.record({ before: BigInt(newer[0].id), limit: 10, page: older, at: NOW });
|
|
87
|
-
(0, chai_1.expect)(store.snapshot()).to.have.length(1);
|
|
88
|
-
const read = store.read(idAt(0), 20);
|
|
89
|
-
(0, chai_1.expect)(ids(read)).to.deep.equal([...ids(older), ...ids(newer)]);
|
|
90
|
-
});
|
|
91
|
-
(0, mocha_1.it)("merges overlapping ranges without duplicating", () => {
|
|
92
|
-
const page = makeMessages(10, 20);
|
|
93
|
-
store.record({ before: idAt(0), limit: 10, page });
|
|
94
|
-
store.record({ before: idAt(0), limit: 10, page }); // same window again
|
|
95
|
-
(0, chai_1.expect)(store.snapshot()).to.have.length(1);
|
|
96
|
-
(0, chai_1.expect)(ids(store.read(idAt(0), 10))).to.deep.equal(ids(page));
|
|
97
|
-
});
|
|
98
|
-
(0, mocha_1.it)("replaces an updated message without changing range coverage", () => {
|
|
99
|
-
const page = makeMessages(5, 20);
|
|
100
|
-
store.record({ before: idAt(0), limit: 5, page });
|
|
101
|
-
const before = store.snapshot();
|
|
102
|
-
const updated = {
|
|
103
|
-
...page[2],
|
|
104
|
-
data: { i: 2, analysed_by: "detector" },
|
|
105
|
-
attachments: [{ id: "updated-image" }],
|
|
106
|
-
};
|
|
107
|
-
store.recordUpdate(updated);
|
|
108
|
-
const read = store.read(idAt(0), 5);
|
|
109
|
-
(0, chai_1.expect)(read[2]).to.equal(updated);
|
|
110
|
-
(0, chai_1.expect)(ids(read)).to.deep.equal(ids(page));
|
|
111
|
-
(0, chai_1.expect)(store.snapshot().map(({ lo, hi, atStart }) => ({ lo, hi, atStart })))
|
|
112
|
-
.to.deep.equal(before.map(({ lo, hi, atStart }) => ({ lo, hi, atStart })));
|
|
113
|
-
});
|
|
114
|
-
(0, mocha_1.it)("keeps disjoint ranges apart rather than claiming the gap", () => {
|
|
115
|
-
const ancient = makeMessages(5, 500);
|
|
116
|
-
const recent = makeMessages(5, 20);
|
|
117
|
-
store.record({ before: idAt(0), limit: 5, page: recent });
|
|
118
|
-
store.record({ before: idAt(400), limit: 5, page: ancient });
|
|
119
|
-
(0, chai_1.expect)(store.snapshot()).to.have.length(2);
|
|
120
|
-
// The hole between them is not covered, so a span across it must refetch
|
|
121
|
-
(0, chai_1.expect)(store.read(idAt(0), 10)).to.equal(undefined);
|
|
122
|
-
});
|
|
123
|
-
(0, mocha_1.it)("serves an anchored read from a range fetched for a different anchor", () => {
|
|
124
|
-
const page = makeMessages(30, 60);
|
|
125
|
-
store.record({ before: idAt(0), limit: 30, page });
|
|
126
|
-
// Jumping to 30 minutes ago costs nothing: already proven
|
|
127
|
-
const read = store.read(idAt(30), 5);
|
|
128
|
-
(0, chai_1.expect)(read).to.not.equal(undefined);
|
|
129
|
-
(0, chai_1.expect)(read.every((m) => m.timestamp < Date.now() - 30 * 60000)).to.equal(true);
|
|
130
|
-
});
|
|
131
|
-
(0, mocha_1.it)("orders by numeric id, not string (500 sorts before 4000)", () => {
|
|
132
|
-
const short = { id: "500", timestamp: 1 };
|
|
133
|
-
const long = { id: "4000", timestamp: 2 };
|
|
134
|
-
store.record({ before: 5000n, limit: 10, page: [long, short], at: NOW });
|
|
135
|
-
(0, chai_1.expect)(ids(store.read(5000n, 10))).to.deep.equal(["500", "4000"]);
|
|
136
|
-
});
|
|
137
|
-
(0, mocha_1.it)("records an empty page as a proven-empty range", () => {
|
|
138
|
-
store.record({ before: idAt(0), limit: 10, page: [] });
|
|
139
|
-
(0, chai_1.expect)(store.read(idAt(0), 10)).to.deep.equal([]);
|
|
140
|
-
});
|
|
141
|
-
(0, mocha_1.describe)("live tip", () => {
|
|
142
|
-
(0, mocha_1.it)("extends coverage with pushes when proven up to now", () => {
|
|
143
|
-
const page = makeMessages(5, 20);
|
|
144
|
-
store.record({ before: idAt(0), limit: 5, page });
|
|
145
|
-
const [live] = makeMessages(1, -1); // one minute into the future
|
|
146
|
-
store.recordLive(live);
|
|
147
|
-
const read = store.read(BigInt(live.id) + 1n, 6);
|
|
148
|
-
(0, chai_1.expect)(ids(read)).to.deep.equal([...ids(page), live.id]);
|
|
149
|
-
});
|
|
150
|
-
(0, mocha_1.it)("ignores pushes for a stale window, which may not be contiguous", () => {
|
|
151
|
-
const page = makeMessages(5, 500);
|
|
152
|
-
// Proven only up to ~8 hours ago, so a push now leaves a hole
|
|
153
|
-
store.record({ before: idAt(480), limit: 5, page });
|
|
154
|
-
const [live] = makeMessages(1, 0);
|
|
155
|
-
store.recordLive(live);
|
|
156
|
-
(0, chai_1.expect)(store.read(BigInt(live.id) + 1n, 6)).to.equal(undefined);
|
|
157
|
-
});
|
|
158
|
-
(0, mocha_1.it)("stops extending once the socket drops", () => {
|
|
159
|
-
const page = makeMessages(5, 20);
|
|
160
|
-
store.record({ before: idAt(0), limit: 5, page });
|
|
161
|
-
store.sealTips(); // gateway "close"
|
|
162
|
-
const [live] = makeMessages(1, -1);
|
|
163
|
-
store.recordLive(live);
|
|
164
|
-
// The push is not trusted to prove the range, so the gap must be refetched
|
|
165
|
-
(0, chai_1.expect)(store.read(BigInt(live.id) + 1n, 6)).to.equal(undefined);
|
|
166
|
-
});
|
|
167
|
-
(0, mocha_1.it)("does not duplicate a push already fetched", () => {
|
|
168
|
-
const page = makeMessages(5, 20);
|
|
169
|
-
store.record({ before: idAt(0), limit: 5, page });
|
|
170
|
-
store.recordLive(page[4]);
|
|
171
|
-
(0, chai_1.expect)(ids(store.read(idAt(0), 5))).to.deep.equal(ids(page));
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
(0, mocha_1.describe)("getChannelRangeStore", () => {
|
|
176
|
-
(0, mocha_1.beforeEach)(() => (0, messageRangeStore_1.resetChannelRangeStores)());
|
|
177
|
-
(0, mocha_1.it)("shares one store per stream key", () => {
|
|
178
|
-
(0, chai_1.expect)((0, messageRangeStore_1.getChannelRangeStore)("a|c")).to.equal((0, messageRangeStore_1.getChannelRangeStore)("a|c"));
|
|
179
|
-
});
|
|
180
|
-
(0, mocha_1.it)("keeps different streams apart", () => {
|
|
181
|
-
(0, chai_1.expect)((0, messageRangeStore_1.getChannelRangeStore)("a|c")).to.not.equal((0, messageRangeStore_1.getChannelRangeStore)("a|d"));
|
|
182
|
-
});
|
|
183
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|