convex 1.44.0 → 1.45.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/CHANGELOG.md +13 -0
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/cli/convexExport.js +1 -1
- package/dist/cjs/cli/convexExport.js.map +1 -1
- package/dist/cjs/cli/index.js +2 -32
- package/dist/cjs/cli/index.js.map +2 -2
- package/dist/cjs/cli/lib/api.js +11 -5
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/convexExport.js +12 -1
- package/dist/cjs/cli/lib/convexExport.js.map +2 -2
- package/dist/cjs/cli/lib/dashboard.js.map +2 -2
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/indexes.js +1 -1
- package/dist/cjs/cli/lib/indexes.js.map +1 -1
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +23 -188
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
- package/dist/cjs/cli/lib/mcp/tools/index.js.map +1 -1
- package/dist/cjs/cli/mcp.js +76 -69
- package/dist/cjs/cli/mcp.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/impl/actions_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/convexExport.d.ts +1 -0
- package/dist/cjs-types/cli/lib/convexExport.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dashboard.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +2 -0
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/tools/index.d.ts +1 -1
- package/dist/cjs-types/cli/lib/mcp/tools/index.d.ts.map +1 -1
- package/dist/cjs-types/cli/mcp.d.ts +3 -0
- package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/server/impl/actions_impl.d.ts +14 -0
- package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +1 -0
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +31210 -25495
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/cli/convexExport.js +1 -1
- package/dist/esm/cli/convexExport.js.map +1 -1
- package/dist/esm/cli/index.js +2 -32
- package/dist/esm/cli/index.js.map +2 -2
- package/dist/esm/cli/lib/api.js +11 -5
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/convexExport.js +16 -3
- package/dist/esm/cli/lib/convexExport.js.map +2 -2
- package/dist/esm/cli/lib/dashboard.js.map +2 -2
- package/dist/esm/cli/lib/indexes.js +1 -1
- package/dist/esm/cli/lib/indexes.js.map +1 -1
- package/dist/esm/cli/lib/localDeployment/upgrade.js +22 -190
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/esm/cli/lib/mcp/tools/index.js.map +1 -1
- package/dist/esm/cli/mcp.js +75 -72
- package/dist/esm/cli/mcp.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/impl/actions_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/convexExport.d.ts +1 -0
- package/dist/esm-types/cli/lib/convexExport.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dashboard.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +2 -0
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/tools/index.d.ts +1 -1
- package/dist/esm-types/cli/lib/mcp/tools/index.d.ts.map +1 -1
- package/dist/esm-types/cli/mcp.d.ts +3 -0
- package/dist/esm-types/cli/mcp.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/server/impl/actions_impl.d.ts +14 -0
- package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +1 -0
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +3 -3
- package/src/cli/convexExport.ts +1 -1
- package/src/cli/index.ts +2 -35
- package/src/cli/lib/api.ts +11 -5
- package/src/cli/lib/convexExport.ts +21 -0
- package/src/cli/lib/dashboard.ts +2 -0
- package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
- package/src/cli/lib/indexes.ts +1 -1
- package/src/cli/lib/localDeployment/upgrade.ts +34 -207
- package/src/cli/lib/mcp/tools/index.ts +1 -1
- package/src/cli/mcp.ts +91 -77
- package/src/index.ts +1 -1
- package/src/server/impl/actions_impl.ts +3 -1
- package/src/server/index.ts +0 -3
- package/dist/cjs-types/browser/http_client.test.d.ts +0 -2
- package/dist/cjs-types/browser/http_client.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/query_options.test.d.ts +0 -2
- package/dist/cjs-types/browser/query_options.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/simple_client.test.d.ts +0 -2
- package/dist/cjs-types/browser/simple_client.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/client.test.d.ts +0 -5
- package/dist/cjs-types/browser/sync/client.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/client_node.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/client_node.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts +0 -44
- package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/local_state.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/local_state.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/optimistic_query_set.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/optimistic_query_set.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/paginated_query_client.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/paginated_query_client.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/protocol.test.d.ts +0 -5
- package/dist/cjs-types/browser/sync/protocol.test.d.ts.map +0 -1
- package/dist/cjs-types/browser/sync/request_manager.test.d.ts +0 -2
- package/dist/cjs-types/browser/sync/request_manager.test.d.ts.map +0 -1
- package/dist/cjs-types/bundler/fs.test.d.ts +0 -2
- package/dist/cjs-types/bundler/fs.test.d.ts.map +0 -1
- package/dist/cjs-types/bundler/index.test.d.ts +0 -2
- package/dist/cjs-types/bundler/index.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/codegen_templates/api.test.d.ts +0 -2
- package/dist/cjs-types/cli/codegen_templates/api.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/codegen_templates/common.test.d.ts +0 -2
- package/dist/cjs-types/cli/codegen_templates/common.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/codegen_templates/templates.test.d.ts +0 -2
- package/dist/cjs-types/cli/codegen_templates/templates.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts +0 -2
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/configure.test.d.ts +0 -2
- package/dist/cjs-types/cli/configure.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/deploymentCreate.test.d.ts +0 -2
- package/dist/cjs-types/cli/deploymentCreate.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/deploymentSelect.test.d.ts +0 -2
- package/dist/cjs-types/cli/deploymentSelect.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/deploymentSelection.test.d.ts +0 -2
- package/dist/cjs-types/cli/deploymentSelection.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/deploymentToken.test.d.ts +0 -2
- package/dist/cjs-types/cli/deploymentToken.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/dev.test.d.ts +0 -2
- package/dist/cjs-types/cli/dev.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/envDefault.test.d.ts +0 -2
- package/dist/cjs-types/cli/envDefault.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/codegen.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/codegen.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/components.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/components.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/config.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/config.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/deployment.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/deployment.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/deploymentSelector.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/deploymentSelector.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/env.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/env.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/expiration.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/formatEnvValueForDotfile.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/formatEnvValueForDotfile.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/formatTargetedDeployment.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/formatTargetedDeployment.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/fsUtils.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/fsUtils.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/indexes.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/indexes.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/localDeployment/run.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/localDeployment/run.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/run.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/run.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/runTestFunction.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/runTestFunction.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/typecheck.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/typecheck.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/updates.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/updates.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/utils/hash.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/utils/hash.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/utils/utils.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/utils/utils.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/versionApi.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/versionApi.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/workos/workos.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/workos/workos.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/login.test.d.ts +0 -2
- package/dist/cjs-types/cli/login.test.d.ts.map +0 -1
- package/dist/cjs-types/common/index.test.d.ts +0 -2
- package/dist/cjs-types/common/index.test.d.ts.map +0 -1
- package/dist/cjs-types/nextjs/nextjs.test.d.ts +0 -2
- package/dist/cjs-types/nextjs/nextjs.test.d.ts.map +0 -1
- package/dist/cjs-types/react/ConvexAuthState.test.d.ts +0 -2
- package/dist/cjs-types/react/ConvexAuthState.test.d.ts.map +0 -1
- package/dist/cjs-types/react/auth_helpers.test.d.ts +0 -2
- package/dist/cjs-types/react/auth_helpers.test.d.ts.map +0 -1
- package/dist/cjs-types/react/auth_websocket.test.d.ts +0 -2
- package/dist/cjs-types/react/auth_websocket.test.d.ts.map +0 -1
- package/dist/cjs-types/react/client.test.d.ts +0 -2
- package/dist/cjs-types/react/client.test.d.ts.map +0 -1
- package/dist/cjs-types/react/client_provided_base_client.test.d.ts +0 -2
- package/dist/cjs-types/react/client_provided_base_client.test.d.ts.map +0 -1
- package/dist/cjs-types/react/queries_observer.test.d.ts +0 -2
- package/dist/cjs-types/react/queries_observer.test.d.ts.map +0 -1
- package/dist/cjs-types/react/react_node.test.d.ts +0 -2
- package/dist/cjs-types/react/react_node.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_paginated_query.test.d.ts +0 -2
- package/dist/cjs-types/react/use_paginated_query.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_queries.test.d.ts +0 -5
- package/dist/cjs-types/react/use_queries.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_query.test.d.ts +0 -5
- package/dist/cjs-types/react/use_query.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_query_object_options.test.d.ts +0 -5
- package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +0 -1
- package/dist/cjs-types/react/use_query_result.test.d.ts +0 -5
- package/dist/cjs-types/react/use_query_result.test.d.ts.map +0 -1
- package/dist/cjs-types/react-auth0/ConvexProviderWithAuth0.test.d.ts +0 -2
- package/dist/cjs-types/react-auth0/ConvexProviderWithAuth0.test.d.ts.map +0 -1
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.test.d.ts +0 -2
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.test.d.ts.map +0 -1
- package/dist/cjs-types/server/api.intersect.test.d.ts +0 -2
- package/dist/cjs-types/server/api.intersect.test.d.ts.map +0 -1
- package/dist/cjs-types/server/api.test.d.ts +0 -2
- package/dist/cjs-types/server/api.test.d.ts.map +0 -1
- package/dist/cjs-types/server/audit_logging.test.d.ts +0 -2
- package/dist/cjs-types/server/audit_logging.test.d.ts.map +0 -1
- package/dist/cjs-types/server/components/index.test.d.ts +0 -2
- package/dist/cjs-types/server/components/index.test.d.ts.map +0 -1
- package/dist/cjs-types/server/cron.test.d.ts +0 -2
- package/dist/cjs-types/server/cron.test.d.ts.map +0 -1
- package/dist/cjs-types/server/data_model.test.d.ts +0 -2
- package/dist/cjs-types/server/data_model.test.d.ts.map +0 -1
- package/dist/cjs-types/server/database.test.d.ts +0 -2
- package/dist/cjs-types/server/database.test.d.ts.map +0 -1
- package/dist/cjs-types/server/database_api.test.d.ts +0 -2
- package/dist/cjs-types/server/database_api.test.d.ts.map +0 -1
- package/dist/cjs-types/server/filter_builder.test.d.ts +0 -2
- package/dist/cjs-types/server/filter_builder.test.d.ts.map +0 -1
- package/dist/cjs-types/server/impl/actions_impl.test.d.ts +0 -2
- package/dist/cjs-types/server/impl/actions_impl.test.d.ts.map +0 -1
- package/dist/cjs-types/server/impl/filter_builder_impl.test.d.ts +0 -2
- package/dist/cjs-types/server/impl/filter_builder_impl.test.d.ts.map +0 -1
- package/dist/cjs-types/server/impl/query_impl.test.d.ts +0 -2
- package/dist/cjs-types/server/impl/query_impl.test.d.ts.map +0 -1
- package/dist/cjs-types/server/pagination.test.d.ts +0 -2
- package/dist/cjs-types/server/pagination.test.d.ts.map +0 -1
- package/dist/cjs-types/server/query.test.d.ts +0 -2
- package/dist/cjs-types/server/query.test.d.ts.map +0 -1
- package/dist/cjs-types/server/registration.test.d.ts +0 -2
- package/dist/cjs-types/server/registration.test.d.ts.map +0 -1
- package/dist/cjs-types/server/router.test.d.ts +0 -2
- package/dist/cjs-types/server/router.test.d.ts.map +0 -1
- package/dist/cjs-types/server/scheduler.test.d.ts +0 -2
- package/dist/cjs-types/server/scheduler.test.d.ts.map +0 -1
- package/dist/cjs-types/server/schema.test.d.ts +0 -2
- package/dist/cjs-types/server/schema.test.d.ts.map +0 -1
- package/dist/cjs-types/test/fake_watch.d.ts +0 -16
- package/dist/cjs-types/test/fake_watch.d.ts.map +0 -1
- package/dist/cjs-types/test/type_testing.d.ts +0 -9
- package/dist/cjs-types/test/type_testing.d.ts.map +0 -1
- package/dist/cjs-types/type_utils.test.d.ts +0 -2
- package/dist/cjs-types/type_utils.test.d.ts.map +0 -1
- package/dist/cjs-types/values/size.test.d.ts +0 -2
- package/dist/cjs-types/values/size.test.d.ts.map +0 -1
- package/dist/cjs-types/values/validator.test.d.ts +0 -2
- package/dist/cjs-types/values/validator.test.d.ts.map +0 -1
- package/dist/cjs-types/values/value.test.d.ts +0 -2
- package/dist/cjs-types/values/value.test.d.ts.map +0 -1
- package/dist/esm-types/browser/http_client.test.d.ts +0 -2
- package/dist/esm-types/browser/http_client.test.d.ts.map +0 -1
- package/dist/esm-types/browser/query_options.test.d.ts +0 -2
- package/dist/esm-types/browser/query_options.test.d.ts.map +0 -1
- package/dist/esm-types/browser/simple_client.test.d.ts +0 -2
- package/dist/esm-types/browser/simple_client.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/client.test.d.ts +0 -5
- package/dist/esm-types/browser/sync/client.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/client_node.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/client_node.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts +0 -44
- package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/local_state.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/local_state.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/optimistic_query_set.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/optimistic_query_set.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/paginated_query_client.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/paginated_query_client.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/protocol.test.d.ts +0 -5
- package/dist/esm-types/browser/sync/protocol.test.d.ts.map +0 -1
- package/dist/esm-types/browser/sync/request_manager.test.d.ts +0 -2
- package/dist/esm-types/browser/sync/request_manager.test.d.ts.map +0 -1
- package/dist/esm-types/bundler/fs.test.d.ts +0 -2
- package/dist/esm-types/bundler/fs.test.d.ts.map +0 -1
- package/dist/esm-types/bundler/index.test.d.ts +0 -2
- package/dist/esm-types/bundler/index.test.d.ts.map +0 -1
- package/dist/esm-types/cli/codegen_templates/api.test.d.ts +0 -2
- package/dist/esm-types/cli/codegen_templates/api.test.d.ts.map +0 -1
- package/dist/esm-types/cli/codegen_templates/common.test.d.ts +0 -2
- package/dist/esm-types/cli/codegen_templates/common.test.d.ts.map +0 -1
- package/dist/esm-types/cli/codegen_templates/templates.test.d.ts +0 -2
- package/dist/esm-types/cli/codegen_templates/templates.test.d.ts.map +0 -1
- package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts +0 -2
- package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts.map +0 -1
- package/dist/esm-types/cli/configure.test.d.ts +0 -2
- package/dist/esm-types/cli/configure.test.d.ts.map +0 -1
- package/dist/esm-types/cli/deploymentCreate.test.d.ts +0 -2
- package/dist/esm-types/cli/deploymentCreate.test.d.ts.map +0 -1
- package/dist/esm-types/cli/deploymentSelect.test.d.ts +0 -2
- package/dist/esm-types/cli/deploymentSelect.test.d.ts.map +0 -1
- package/dist/esm-types/cli/deploymentSelection.test.d.ts +0 -2
- package/dist/esm-types/cli/deploymentSelection.test.d.ts.map +0 -1
- package/dist/esm-types/cli/deploymentToken.test.d.ts +0 -2
- package/dist/esm-types/cli/deploymentToken.test.d.ts.map +0 -1
- package/dist/esm-types/cli/dev.test.d.ts +0 -2
- package/dist/esm-types/cli/dev.test.d.ts.map +0 -1
- package/dist/esm-types/cli/envDefault.test.d.ts +0 -2
- package/dist/esm-types/cli/envDefault.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/codegen.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/codegen.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/components.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/components.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/config.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/config.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/deployment.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/deployment.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/deploymentSelector.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/deploymentSelector.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/env.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/env.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/expiration.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/expiration.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/formatEnvValueForDotfile.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/formatEnvValueForDotfile.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/formatTargetedDeployment.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/formatTargetedDeployment.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/fsUtils.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/fsUtils.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/generateDocs.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/indexes.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/indexes.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/localDeployment/run.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/localDeployment/run.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/run.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/run.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/runTestFunction.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/runTestFunction.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/typecheck.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/typecheck.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/updates.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/updates.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/utils/hash.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/utils/hash.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/utils/utils.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/utils/utils.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/versionApi.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/versionApi.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/workos/workos.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/workos/workos.test.d.ts.map +0 -1
- package/dist/esm-types/cli/login.test.d.ts +0 -2
- package/dist/esm-types/cli/login.test.d.ts.map +0 -1
- package/dist/esm-types/common/index.test.d.ts +0 -2
- package/dist/esm-types/common/index.test.d.ts.map +0 -1
- package/dist/esm-types/nextjs/nextjs.test.d.ts +0 -2
- package/dist/esm-types/nextjs/nextjs.test.d.ts.map +0 -1
- package/dist/esm-types/react/ConvexAuthState.test.d.ts +0 -2
- package/dist/esm-types/react/ConvexAuthState.test.d.ts.map +0 -1
- package/dist/esm-types/react/auth_helpers.test.d.ts +0 -2
- package/dist/esm-types/react/auth_helpers.test.d.ts.map +0 -1
- package/dist/esm-types/react/auth_websocket.test.d.ts +0 -2
- package/dist/esm-types/react/auth_websocket.test.d.ts.map +0 -1
- package/dist/esm-types/react/client.test.d.ts +0 -2
- package/dist/esm-types/react/client.test.d.ts.map +0 -1
- package/dist/esm-types/react/client_provided_base_client.test.d.ts +0 -2
- package/dist/esm-types/react/client_provided_base_client.test.d.ts.map +0 -1
- package/dist/esm-types/react/queries_observer.test.d.ts +0 -2
- package/dist/esm-types/react/queries_observer.test.d.ts.map +0 -1
- package/dist/esm-types/react/react_node.test.d.ts +0 -2
- package/dist/esm-types/react/react_node.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_paginated_query.test.d.ts +0 -2
- package/dist/esm-types/react/use_paginated_query.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_queries.test.d.ts +0 -5
- package/dist/esm-types/react/use_queries.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_query.test.d.ts +0 -5
- package/dist/esm-types/react/use_query.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_query_object_options.test.d.ts +0 -5
- package/dist/esm-types/react/use_query_object_options.test.d.ts.map +0 -1
- package/dist/esm-types/react/use_query_result.test.d.ts +0 -5
- package/dist/esm-types/react/use_query_result.test.d.ts.map +0 -1
- package/dist/esm-types/react-auth0/ConvexProviderWithAuth0.test.d.ts +0 -2
- package/dist/esm-types/react-auth0/ConvexProviderWithAuth0.test.d.ts.map +0 -1
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.test.d.ts +0 -2
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.test.d.ts.map +0 -1
- package/dist/esm-types/server/api.intersect.test.d.ts +0 -2
- package/dist/esm-types/server/api.intersect.test.d.ts.map +0 -1
- package/dist/esm-types/server/api.test.d.ts +0 -2
- package/dist/esm-types/server/api.test.d.ts.map +0 -1
- package/dist/esm-types/server/audit_logging.test.d.ts +0 -2
- package/dist/esm-types/server/audit_logging.test.d.ts.map +0 -1
- package/dist/esm-types/server/components/index.test.d.ts +0 -2
- package/dist/esm-types/server/components/index.test.d.ts.map +0 -1
- package/dist/esm-types/server/cron.test.d.ts +0 -2
- package/dist/esm-types/server/cron.test.d.ts.map +0 -1
- package/dist/esm-types/server/data_model.test.d.ts +0 -2
- package/dist/esm-types/server/data_model.test.d.ts.map +0 -1
- package/dist/esm-types/server/database.test.d.ts +0 -2
- package/dist/esm-types/server/database.test.d.ts.map +0 -1
- package/dist/esm-types/server/database_api.test.d.ts +0 -2
- package/dist/esm-types/server/database_api.test.d.ts.map +0 -1
- package/dist/esm-types/server/filter_builder.test.d.ts +0 -2
- package/dist/esm-types/server/filter_builder.test.d.ts.map +0 -1
- package/dist/esm-types/server/impl/actions_impl.test.d.ts +0 -2
- package/dist/esm-types/server/impl/actions_impl.test.d.ts.map +0 -1
- package/dist/esm-types/server/impl/filter_builder_impl.test.d.ts +0 -2
- package/dist/esm-types/server/impl/filter_builder_impl.test.d.ts.map +0 -1
- package/dist/esm-types/server/impl/query_impl.test.d.ts +0 -2
- package/dist/esm-types/server/impl/query_impl.test.d.ts.map +0 -1
- package/dist/esm-types/server/pagination.test.d.ts +0 -2
- package/dist/esm-types/server/pagination.test.d.ts.map +0 -1
- package/dist/esm-types/server/query.test.d.ts +0 -2
- package/dist/esm-types/server/query.test.d.ts.map +0 -1
- package/dist/esm-types/server/registration.test.d.ts +0 -2
- package/dist/esm-types/server/registration.test.d.ts.map +0 -1
- package/dist/esm-types/server/router.test.d.ts +0 -2
- package/dist/esm-types/server/router.test.d.ts.map +0 -1
- package/dist/esm-types/server/scheduler.test.d.ts +0 -2
- package/dist/esm-types/server/scheduler.test.d.ts.map +0 -1
- package/dist/esm-types/server/schema.test.d.ts +0 -2
- package/dist/esm-types/server/schema.test.d.ts.map +0 -1
- package/dist/esm-types/test/fake_watch.d.ts +0 -16
- package/dist/esm-types/test/fake_watch.d.ts.map +0 -1
- package/dist/esm-types/test/type_testing.d.ts +0 -9
- package/dist/esm-types/test/type_testing.d.ts.map +0 -1
- package/dist/esm-types/type_utils.test.d.ts +0 -2
- package/dist/esm-types/type_utils.test.d.ts.map +0 -1
- package/dist/esm-types/values/size.test.d.ts +0 -2
- package/dist/esm-types/values/size.test.d.ts.map +0 -1
- package/dist/esm-types/values/validator.test.d.ts +0 -2
- package/dist/esm-types/values/validator.test.d.ts.map +0 -1
- package/dist/esm-types/values/value.test.d.ts +0 -2
- package/dist/esm-types/values/value.test.d.ts.map +0 -1
- package/src/browser/http_client.test.ts +0 -202
- package/src/browser/query_options.test.ts +0 -43
- package/src/browser/simple_client.test.ts +0 -104
- package/src/browser/sync/client.test.ts +0 -44
- package/src/browser/sync/client_node.test.ts +0 -1207
- package/src/browser/sync/client_node_test_helpers.ts +0 -200
- package/src/browser/sync/local_state.test.ts +0 -128
- package/src/browser/sync/optimistic_query_set.test.ts +0 -253
- package/src/browser/sync/paginated_query_client.test.ts +0 -597
- package/src/browser/sync/protocol.test.ts +0 -14
- package/src/browser/sync/request_manager.test.ts +0 -273
- package/src/bundler/fs.test.ts +0 -86
- package/src/bundler/index.test.ts +0 -210
- package/src/bundler/test_fixtures/js/project01/bar.js +0 -4
- package/src/bundler/test_fixtures/js/project01/file with spaces.js +0 -1
- package/src/bundler/test_fixtures/js/project01/foo.js +0 -9
- package/src/bundler/test_fixtures/js/project_with_https/https.js +0 -9
- package/src/bundler/test_fixtures/js/project_with_https_not_at_top_level/default.js +0 -3
- package/src/bundler/test_fixtures/js/project_with_https_not_at_top_level/more_code/https.js +0 -5
- package/src/bundler/test_fixtures/js/project_with_https_without_router/https.js +0 -1
- package/src/bundler/test_fixtures/js/project_with_node_shims/uses_node_shims.js +0 -4
- package/src/cli/codegen_templates/api.test.ts +0 -18
- package/src/cli/codegen_templates/common.test.ts +0 -52
- package/src/cli/codegen_templates/templates.test.ts +0 -16
- package/src/cli/codegen_templates/validator_helpers.test.ts +0 -31
- package/src/cli/configure.test.ts +0 -138
- package/src/cli/deploymentCreate.test.ts +0 -1376
- package/src/cli/deploymentSelect.test.ts +0 -1291
- package/src/cli/deploymentSelection.test.ts +0 -2546
- package/src/cli/deploymentToken.test.ts +0 -397
- package/src/cli/dev.test.ts +0 -157
- package/src/cli/envDefault.test.ts +0 -495
- package/src/cli/lib/__snapshots__/formatTargetedDeployment.test.ts.snap +0 -94
- package/src/cli/lib/aiFiles/agentsmd.test.ts +0 -133
- package/src/cli/lib/aiFiles/claudemd.test.ts +0 -92
- package/src/cli/lib/aiFiles/guidelinesmd.test.ts +0 -50
- package/src/cli/lib/aiFiles/index.test.ts +0 -986
- package/src/cli/lib/aiFiles/integration.test.ts +0 -692
- package/src/cli/lib/aiFiles/prompt.test.ts +0 -202
- package/src/cli/lib/aiFiles/state.test.ts +0 -305
- package/src/cli/lib/aiFiles/utils.test.ts +0 -50
- package/src/cli/lib/codegen.test.ts +0 -49
- package/src/cli/lib/components.test.ts +0 -227
- package/src/cli/lib/config.test.ts +0 -1026
- package/src/cli/lib/deployment.test.ts +0 -85
- package/src/cli/lib/deploymentSelector.test.ts +0 -107
- package/src/cli/lib/env.test.ts +0 -60
- package/src/cli/lib/expiration.test.ts +0 -159
- package/src/cli/lib/extractDeploymentNameForWorkOS.test.ts +0 -30
- package/src/cli/lib/formatEnvValueForDotfile.test.ts +0 -294
- package/src/cli/lib/formatTargetedDeployment.test.ts +0 -281
- package/src/cli/lib/fsUtils.test.ts +0 -67
- package/src/cli/lib/generateDocs.test.ts +0 -326
- package/src/cli/lib/indexes.test.ts +0 -77
- package/src/cli/lib/localDeployment/run.test.ts +0 -104
- package/src/cli/lib/localDeployment/secrets.test.ts +0 -53
- package/src/cli/lib/run.test.ts +0 -54
- package/src/cli/lib/runTestFunction.test.ts +0 -84
- package/src/cli/lib/typecheck.test.ts +0 -71
- package/src/cli/lib/updates.test.ts +0 -157
- package/src/cli/lib/utils/hash.test.ts +0 -25
- package/src/cli/lib/utils/utils.test.ts +0 -340
- package/src/cli/lib/versionApi.test.ts +0 -471
- package/src/cli/lib/workos/environmentApi.test.ts +0 -107
- package/src/cli/lib/workos/workos.test.ts +0 -242
- package/src/cli/login.test.ts +0 -261
- package/src/common/README.md +0 -2
- package/src/common/index.test.ts +0 -35
- package/src/nextjs/nextjs.test.tsx +0 -94
- package/src/react/ConvexAuthState.test.tsx +0 -702
- package/src/react/auth_helpers.test.tsx +0 -45
- package/src/react/auth_websocket.test.tsx +0 -1177
- package/src/react/client.test.tsx +0 -261
- package/src/react/client_provided_base_client.test.tsx +0 -174
- package/src/react/queries_observer.test.ts +0 -176
- package/src/react/react_node.test.ts +0 -78
- package/src/react/use_paginated_query.test.tsx +0 -1420
- package/src/react/use_queries.test.ts +0 -140
- package/src/react/use_query.test.ts +0 -71
- package/src/react/use_query_object_options.test.ts +0 -51
- package/src/react/use_query_result.test.ts +0 -75
- package/src/react-auth0/ConvexProviderWithAuth0.test.tsx +0 -17
- package/src/react-clerk/ConvexProviderWithClerk.test.tsx +0 -18
- package/src/server/README.md +0 -15
- package/src/server/api.intersect.test.ts +0 -109
- package/src/server/api.test.ts +0 -447
- package/src/server/audit_logging.test.ts +0 -131
- package/src/server/components/index.test.ts +0 -48
- package/src/server/cron.test.ts +0 -58
- package/src/server/data_model.test.ts +0 -221
- package/src/server/database.test.ts +0 -184
- package/src/server/database_api.test.ts +0 -439
- package/src/server/filter_builder.test.ts +0 -102
- package/src/server/impl/actions_impl.test.ts +0 -59
- package/src/server/impl/filter_builder_impl.test.ts +0 -13
- package/src/server/impl/query_impl.test.ts +0 -46
- package/src/server/pagination.test.ts +0 -49
- package/src/server/query.test.ts +0 -112
- package/src/server/registration.test.ts +0 -589
- package/src/server/router.test.ts +0 -148
- package/src/server/scheduler.test.ts +0 -31
- package/src/server/schema.test.ts +0 -1081
- package/src/test/fake_watch.ts +0 -54
- package/src/test/type_testing.ts +0 -21
- package/src/type_utils.test.ts +0 -62
- package/src/values/size.test.ts +0 -95
- package/src/values/validator.test.ts +0 -619
- package/src/values/value.test.ts +0 -232
- package/src/vendor/README.md +0 -18
- package/src/vendor/jwt-decode/README.md +0 -1
|
@@ -1,702 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @vitest-environment custom-vitest-environment.ts
|
|
3
|
-
*/
|
|
4
|
-
import { expect, vi, test } from "vitest";
|
|
5
|
-
import { act, render, screen, within } from "@testing-library/react";
|
|
6
|
-
import { jwtEncode } from "../vendor/jwt-encode/index.js";
|
|
7
|
-
import React, { createContext, useCallback, useContext, useMemo } from "react";
|
|
8
|
-
import {
|
|
9
|
-
ConvexProviderWithAuth,
|
|
10
|
-
ConvexReactClient,
|
|
11
|
-
useConvexAuth,
|
|
12
|
-
} from "./index.js";
|
|
13
|
-
import {
|
|
14
|
-
BaseConvexClient,
|
|
15
|
-
BaseConvexClientInterface,
|
|
16
|
-
} from "../browser/index.js";
|
|
17
|
-
|
|
18
|
-
vi.useFakeTimers();
|
|
19
|
-
|
|
20
|
-
const flushPromises = async () => {
|
|
21
|
-
const timers = await vi.importActual("timers");
|
|
22
|
-
await act(() => new Promise((timers as any).setImmediate));
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
// Test helpers reach into `BaseConvexClient`'s private internals; the tests
|
|
26
|
-
// only ever construct `ConvexReactClient` without a `baseClient` override, so
|
|
27
|
-
// `sync` is always a real `BaseConvexClient` under the hood.
|
|
28
|
-
const syncAsBaseConvexClient = (sync: BaseConvexClientInterface) => {
|
|
29
|
-
if (!(sync instanceof BaseConvexClient)) {
|
|
30
|
-
throw new Error("Expected `sync` to be a `BaseConvexClient`");
|
|
31
|
-
}
|
|
32
|
-
return sync;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
test("setAuth legacy signature typechecks and doesn't throw", async () => {
|
|
36
|
-
const convex = new ConvexReactClient("https://127.0.0.1:3001");
|
|
37
|
-
// We're moving towards removing the Promise, but for backwards compatibility
|
|
38
|
-
// it's still here now.
|
|
39
|
-
await convex.setAuth(async () => "foo");
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test("ConvexProviderWithAuth works", async () => {
|
|
43
|
-
// This is our fake ProviderX state
|
|
44
|
-
const AuthProviderXContext = createContext<{
|
|
45
|
-
isLoading: boolean;
|
|
46
|
-
isAuthenticated: boolean;
|
|
47
|
-
getToken: (args: { ignoreCache: boolean }) => Promise<string | null>;
|
|
48
|
-
}>(null as any);
|
|
49
|
-
|
|
50
|
-
// Fake ProviderX React hook
|
|
51
|
-
const useProviderXAuth = () => {
|
|
52
|
-
return useContext(AuthProviderXContext);
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
// What our users would have to write, this is the same as in docs
|
|
56
|
-
// but works in TypeScript. We should transpile this back to JS
|
|
57
|
-
// and use it as a snippet in docs.
|
|
58
|
-
function useAuthFromProviderX() {
|
|
59
|
-
const { isLoading, isAuthenticated, getToken } = useProviderXAuth();
|
|
60
|
-
const fetchAccessToken = useCallback(
|
|
61
|
-
async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {
|
|
62
|
-
// Here you can do whatever transformation to get the ID Token
|
|
63
|
-
// or null
|
|
64
|
-
// Make sure to fetch a new token when `forceRefreshToken` is true
|
|
65
|
-
return await getToken({ ignoreCache: forceRefreshToken });
|
|
66
|
-
},
|
|
67
|
-
// If `getToken` isn't correctly memoized
|
|
68
|
-
// remove it from this dependency array
|
|
69
|
-
[getToken],
|
|
70
|
-
);
|
|
71
|
-
return useMemo(
|
|
72
|
-
() => ({
|
|
73
|
-
// Whether the auth provider is in a loading state
|
|
74
|
-
isLoading: isLoading,
|
|
75
|
-
// Whether the auth provider has the user signed in
|
|
76
|
-
isAuthenticated: isAuthenticated ?? false,
|
|
77
|
-
// The async function to fetch the ID token
|
|
78
|
-
fetchAccessToken,
|
|
79
|
-
}),
|
|
80
|
-
[isLoading, isAuthenticated, fetchAccessToken],
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const convex = new ConvexReactClient("https://127.0.0.1:3001");
|
|
85
|
-
|
|
86
|
-
// Our app will mirror the Convex auth state
|
|
87
|
-
const App = () => {
|
|
88
|
-
const { isLoading, isAuthenticated } = useConvexAuth();
|
|
89
|
-
return (
|
|
90
|
-
<>
|
|
91
|
-
{isLoading
|
|
92
|
-
? "Loading..."
|
|
93
|
-
: isAuthenticated
|
|
94
|
-
? "Authenticated"
|
|
95
|
-
: "Unauthenticated"}
|
|
96
|
-
</>
|
|
97
|
-
);
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
const element = (
|
|
101
|
-
<ConvexProviderWithAuth client={convex} useAuth={useAuthFromProviderX}>
|
|
102
|
-
<App />
|
|
103
|
-
</ConvexProviderWithAuth>
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
const { rerender } = render(
|
|
107
|
-
<AuthProviderXContext.Provider
|
|
108
|
-
value={{
|
|
109
|
-
isLoading: true,
|
|
110
|
-
isAuthenticated: false,
|
|
111
|
-
getToken: async () => null,
|
|
112
|
-
}}
|
|
113
|
-
>
|
|
114
|
-
{element}
|
|
115
|
-
</AuthProviderXContext.Provider>,
|
|
116
|
-
);
|
|
117
|
-
expect(screen.getByText("Loading...")).toBeDefined();
|
|
118
|
-
|
|
119
|
-
const token = jwtEncode({ iat: 1234500, exp: 1234500 + 30 }, "secret");
|
|
120
|
-
|
|
121
|
-
rerender(
|
|
122
|
-
<AuthProviderXContext.Provider
|
|
123
|
-
value={{
|
|
124
|
-
isLoading: false,
|
|
125
|
-
isAuthenticated: true,
|
|
126
|
-
getToken: async () => token,
|
|
127
|
-
}}
|
|
128
|
-
>
|
|
129
|
-
{element}
|
|
130
|
-
</AuthProviderXContext.Provider>,
|
|
131
|
-
);
|
|
132
|
-
expect(screen.getByText("Loading...")).toBeDefined();
|
|
133
|
-
|
|
134
|
-
vi.runOnlyPendingTimers();
|
|
135
|
-
|
|
136
|
-
await flushPromises();
|
|
137
|
-
|
|
138
|
-
mockServerConfirmsAuth(convex, 0);
|
|
139
|
-
|
|
140
|
-
expect(screen.getByText("Authenticated")).toBeDefined();
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
// This is no longer really possible, because
|
|
144
|
-
// we wait on server response before scheduling token refetch,
|
|
145
|
-
// and the server currently requires JWT tokens.
|
|
146
|
-
test("Tokens must be valid JWT", async () => {
|
|
147
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001");
|
|
148
|
-
const consoleSpy = vi
|
|
149
|
-
.spyOn(global.console, "error")
|
|
150
|
-
.mockImplementation(() => {
|
|
151
|
-
// Do nothing
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
let tokenId = 0;
|
|
155
|
-
void client.setAuth(
|
|
156
|
-
async () => "foo" + tokenId++, // simulate a new token on every fetch
|
|
157
|
-
() => {
|
|
158
|
-
// Do nothing
|
|
159
|
-
},
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
// Wait for token
|
|
163
|
-
await flushPromises();
|
|
164
|
-
|
|
165
|
-
// Server confirms it
|
|
166
|
-
mockServerConfirmsAuth(client, 0);
|
|
167
|
-
|
|
168
|
-
// Wait for token with `forceRefreshToken: true`
|
|
169
|
-
await flushPromises();
|
|
170
|
-
|
|
171
|
-
// Server confirms it
|
|
172
|
-
mockServerConfirmsAuth(client, 1);
|
|
173
|
-
|
|
174
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
175
|
-
"Auth token is not a valid JWT, cannot refetch the token",
|
|
176
|
-
);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
test("Tokens are used to schedule refetch", async () => {
|
|
180
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001");
|
|
181
|
-
const tokenLifetimeSeconds = 60;
|
|
182
|
-
let tokenId = 0;
|
|
183
|
-
const tokenFetcher = vi.fn(async () =>
|
|
184
|
-
jwtEncode(
|
|
185
|
-
{ iat: 1234500, exp: 1234500 + tokenLifetimeSeconds },
|
|
186
|
-
"secret" + tokenId++, // simulate a new token on every fetch
|
|
187
|
-
),
|
|
188
|
-
);
|
|
189
|
-
void client.setAuth(tokenFetcher, () => {
|
|
190
|
-
// Do nothing
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
// Wait for token
|
|
194
|
-
await flushPromises();
|
|
195
|
-
|
|
196
|
-
// Server confirms it
|
|
197
|
-
mockServerConfirmsAuth(client, 0);
|
|
198
|
-
|
|
199
|
-
// Wait for token with `forceRefreshToken: true`
|
|
200
|
-
await flushPromises();
|
|
201
|
-
|
|
202
|
-
// Confirm refetched token
|
|
203
|
-
mockServerConfirmsAuth(client, 1);
|
|
204
|
-
|
|
205
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(2);
|
|
206
|
-
|
|
207
|
-
// Check that next refetch happens in time
|
|
208
|
-
vi.advanceTimersByTime(tokenLifetimeSeconds * 1000);
|
|
209
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(3);
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
function mockServerConfirmsAuth(
|
|
213
|
-
client: ConvexReactClient,
|
|
214
|
-
oldIdentityVersion: number,
|
|
215
|
-
clientClockSkew?: number,
|
|
216
|
-
) {
|
|
217
|
-
act(() => {
|
|
218
|
-
const querySetVersion = syncAsBaseConvexClient(client.sync)[
|
|
219
|
-
"remoteQuerySet"
|
|
220
|
-
]["version"];
|
|
221
|
-
syncAsBaseConvexClient(client.sync)["authenticationManager"].onTransition({
|
|
222
|
-
type: "Transition",
|
|
223
|
-
startVersion: {
|
|
224
|
-
...querySetVersion,
|
|
225
|
-
identity: oldIdentityVersion,
|
|
226
|
-
},
|
|
227
|
-
endVersion: {
|
|
228
|
-
...querySetVersion,
|
|
229
|
-
identity: oldIdentityVersion + 1,
|
|
230
|
-
},
|
|
231
|
-
modifications: [],
|
|
232
|
-
...(clientClockSkew !== undefined ? { clientClockSkew } : {}),
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
test("isRefreshing reflects reauthentication in React tree", async () => {
|
|
238
|
-
const AuthProviderXContext = createContext<{
|
|
239
|
-
isLoading: boolean;
|
|
240
|
-
isAuthenticated: boolean;
|
|
241
|
-
getToken: (args: { ignoreCache: boolean }) => Promise<string | null>;
|
|
242
|
-
}>(null as any);
|
|
243
|
-
|
|
244
|
-
const useProviderXAuth = () => useContext(AuthProviderXContext);
|
|
245
|
-
|
|
246
|
-
function useAuthFromProviderX() {
|
|
247
|
-
const { isLoading, isAuthenticated, getToken } = useProviderXAuth();
|
|
248
|
-
const fetchAccessToken = useCallback(
|
|
249
|
-
async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {
|
|
250
|
-
return await getToken({ ignoreCache: forceRefreshToken });
|
|
251
|
-
},
|
|
252
|
-
[getToken],
|
|
253
|
-
);
|
|
254
|
-
return useMemo(
|
|
255
|
-
() => ({
|
|
256
|
-
isLoading,
|
|
257
|
-
isAuthenticated: isAuthenticated ?? false,
|
|
258
|
-
fetchAccessToken,
|
|
259
|
-
}),
|
|
260
|
-
[isLoading, isAuthenticated, fetchAccessToken],
|
|
261
|
-
);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
const convex = new ConvexReactClient("https://127.0.0.1:3001");
|
|
265
|
-
|
|
266
|
-
const App = () => {
|
|
267
|
-
const { isLoading, isAuthenticated, isRefreshing } = useConvexAuth();
|
|
268
|
-
return (
|
|
269
|
-
<>
|
|
270
|
-
{isLoading
|
|
271
|
-
? "Loading..."
|
|
272
|
-
: isAuthenticated
|
|
273
|
-
? "Authenticated"
|
|
274
|
-
: "Unauthenticated"}
|
|
275
|
-
{isRefreshing && " (Refreshing)"}
|
|
276
|
-
</>
|
|
277
|
-
);
|
|
278
|
-
};
|
|
279
|
-
|
|
280
|
-
const tokenLifetimeSeconds = 60;
|
|
281
|
-
let tokenId = 0;
|
|
282
|
-
const getToken = vi.fn(async () =>
|
|
283
|
-
jwtEncode(
|
|
284
|
-
{ iat: 1234500, exp: 1234500 + tokenLifetimeSeconds },
|
|
285
|
-
"secret" + tokenId++,
|
|
286
|
-
),
|
|
287
|
-
);
|
|
288
|
-
|
|
289
|
-
const element = (
|
|
290
|
-
<ConvexProviderWithAuth client={convex} useAuth={useAuthFromProviderX}>
|
|
291
|
-
<App />
|
|
292
|
-
</ConvexProviderWithAuth>
|
|
293
|
-
);
|
|
294
|
-
|
|
295
|
-
const { container } = render(
|
|
296
|
-
<AuthProviderXContext.Provider
|
|
297
|
-
value={{
|
|
298
|
-
isLoading: false,
|
|
299
|
-
isAuthenticated: true,
|
|
300
|
-
getToken,
|
|
301
|
-
}}
|
|
302
|
-
>
|
|
303
|
-
{element}
|
|
304
|
-
</AuthProviderXContext.Provider>,
|
|
305
|
-
);
|
|
306
|
-
const view = within(container);
|
|
307
|
-
|
|
308
|
-
// Get through initial auth. Background token rotation is silent, so no
|
|
309
|
-
// Refreshing flash should appear during this sequence.
|
|
310
|
-
await flushPromises();
|
|
311
|
-
mockServerConfirmsAuth(convex, 0);
|
|
312
|
-
await flushPromises();
|
|
313
|
-
mockServerConfirmsAuth(convex, 1);
|
|
314
|
-
|
|
315
|
-
expect(view.getByText("Authenticated")).toBeDefined();
|
|
316
|
-
expect(view.queryByText(/Refreshing/)).toBeNull();
|
|
317
|
-
|
|
318
|
-
// Advancing the scheduled refresh timer must remain silent in the UI.
|
|
319
|
-
act(() => {
|
|
320
|
-
vi.advanceTimersByTime(tokenLifetimeSeconds * 1000);
|
|
321
|
-
});
|
|
322
|
-
expect(view.queryByText(/Refreshing/)).toBeNull();
|
|
323
|
-
|
|
324
|
-
await flushPromises();
|
|
325
|
-
mockServerConfirmsAuth(convex, 2);
|
|
326
|
-
expect(view.queryByText(/Refreshing/)).toBeNull();
|
|
327
|
-
|
|
328
|
-
// Server rejects a token mid-session, triggering reauthentication.
|
|
329
|
-
act(() => {
|
|
330
|
-
syncAsBaseConvexClient(convex.sync)["authenticationManager"].onAuthError({
|
|
331
|
-
type: "AuthError",
|
|
332
|
-
error: "token expired",
|
|
333
|
-
baseVersion: 2,
|
|
334
|
-
authUpdateAttempted: false,
|
|
335
|
-
});
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
// Socket is paused while we fetch a new token, but the user is still
|
|
339
|
-
// locally authenticated.
|
|
340
|
-
expect(view.getByText(/Refreshing/)).toBeDefined();
|
|
341
|
-
expect(view.getByText(/Authenticated/)).toBeDefined();
|
|
342
|
-
|
|
343
|
-
await flushPromises();
|
|
344
|
-
mockServerConfirmsAuth(convex, 3);
|
|
345
|
-
|
|
346
|
-
expect(view.queryByText(/Refreshing/)).toBeNull();
|
|
347
|
-
expect(view.getByText("Authenticated")).toBeDefined();
|
|
348
|
-
|
|
349
|
-
await convex.close();
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
test("isRefreshing becomes false when reauth fetch fails", async () => {
|
|
353
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001");
|
|
354
|
-
const tokenLifetimeSeconds = 60;
|
|
355
|
-
let tokenId = 0;
|
|
356
|
-
|
|
357
|
-
// First two calls (initial cached + initial fresh) succeed; the reauth
|
|
358
|
-
// attempt returns null to simulate the token fetcher failing.
|
|
359
|
-
const tokenFetcher = vi.fn(async () => {
|
|
360
|
-
if (tokenId++ < 2) {
|
|
361
|
-
return jwtEncode(
|
|
362
|
-
{ iat: 1234500, exp: 1234500 + tokenLifetimeSeconds },
|
|
363
|
-
"secret" + tokenId,
|
|
364
|
-
);
|
|
365
|
-
}
|
|
366
|
-
return null;
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
const onRefreshChange = vi.fn();
|
|
370
|
-
void client.setAuth(tokenFetcher, () => {}, onRefreshChange);
|
|
371
|
-
|
|
372
|
-
await flushPromises();
|
|
373
|
-
mockServerConfirmsAuth(client, 0);
|
|
374
|
-
await flushPromises();
|
|
375
|
-
mockServerConfirmsAuth(client, 1);
|
|
376
|
-
|
|
377
|
-
onRefreshChange.mockClear();
|
|
378
|
-
|
|
379
|
-
// Server rejects the token; tryToReauthenticate runs but the fetcher
|
|
380
|
-
// returns null on its retry.
|
|
381
|
-
syncAsBaseConvexClient(client.sync)["authenticationManager"].onAuthError({
|
|
382
|
-
type: "AuthError",
|
|
383
|
-
error: "token expired",
|
|
384
|
-
baseVersion: 1,
|
|
385
|
-
authUpdateAttempted: false,
|
|
386
|
-
});
|
|
387
|
-
await flushPromises();
|
|
388
|
-
|
|
389
|
-
expect(onRefreshChange).toHaveBeenCalledWith(true);
|
|
390
|
-
expect(onRefreshChange).toHaveBeenCalledWith(false);
|
|
391
|
-
|
|
392
|
-
await client.close();
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
test("isRefreshing is not set during initial token fetch (no cached token)", async () => {
|
|
396
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001");
|
|
397
|
-
const tokenLifetimeSeconds = 60;
|
|
398
|
-
let tokenId = 0;
|
|
399
|
-
|
|
400
|
-
// Return null on first call (no cached token), valid tokens afterwards
|
|
401
|
-
const tokenFetcher = vi.fn(
|
|
402
|
-
async ({ forceRefreshToken }: { forceRefreshToken: boolean }) => {
|
|
403
|
-
if (!forceRefreshToken) {
|
|
404
|
-
return null; // No cached token available
|
|
405
|
-
}
|
|
406
|
-
return jwtEncode(
|
|
407
|
-
{ iat: 1234500, exp: 1234500 + tokenLifetimeSeconds },
|
|
408
|
-
"secret" + tokenId++,
|
|
409
|
-
);
|
|
410
|
-
},
|
|
411
|
-
);
|
|
412
|
-
|
|
413
|
-
const onRefreshChange = vi.fn();
|
|
414
|
-
void client.setAuth(tokenFetcher, () => {}, onRefreshChange);
|
|
415
|
-
|
|
416
|
-
// Wait for initial (cached) fetch - returns null, enters initialRefetch
|
|
417
|
-
await flushPromises();
|
|
418
|
-
|
|
419
|
-
// Wait for force-refresh fetch in initialRefetch state
|
|
420
|
-
await flushPromises();
|
|
421
|
-
|
|
422
|
-
// onRefreshChange should NOT have been called during the initialRefetch path,
|
|
423
|
-
// because "refreshing" implies re-acquiring a token that already existed.
|
|
424
|
-
expect(onRefreshChange).not.toHaveBeenCalledWith(true);
|
|
425
|
-
|
|
426
|
-
// Server confirms the fresh token
|
|
427
|
-
mockServerConfirmsAuth(client, 0);
|
|
428
|
-
|
|
429
|
-
await client.close();
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
test("isFromOutdatedConfig during reauth resets isRefreshing via resetAuthState", async () => {
|
|
433
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001");
|
|
434
|
-
const tokenLifetimeSeconds = 60;
|
|
435
|
-
let tokenId = 0;
|
|
436
|
-
const tokenFetcher = vi.fn(async () =>
|
|
437
|
-
jwtEncode(
|
|
438
|
-
{ iat: 1234500, exp: 1234500 + tokenLifetimeSeconds },
|
|
439
|
-
"secret" + tokenId++,
|
|
440
|
-
),
|
|
441
|
-
);
|
|
442
|
-
|
|
443
|
-
const onRefreshChange = vi.fn();
|
|
444
|
-
void client.setAuth(tokenFetcher, () => {}, onRefreshChange);
|
|
445
|
-
|
|
446
|
-
await flushPromises();
|
|
447
|
-
mockServerConfirmsAuth(client, 0);
|
|
448
|
-
await flushPromises();
|
|
449
|
-
mockServerConfirmsAuth(client, 1);
|
|
450
|
-
|
|
451
|
-
onRefreshChange.mockClear();
|
|
452
|
-
|
|
453
|
-
// Server rejects the token, kicking off tryToReauthenticate.
|
|
454
|
-
syncAsBaseConvexClient(client.sync)["authenticationManager"].onAuthError({
|
|
455
|
-
type: "AuthError",
|
|
456
|
-
error: "token expired",
|
|
457
|
-
baseVersion: 1,
|
|
458
|
-
authUpdateAttempted: false,
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
expect(onRefreshChange).toHaveBeenCalledWith(true);
|
|
462
|
-
|
|
463
|
-
// Call setAuth again while the reauth fetch is in flight. This bumps
|
|
464
|
-
// configVersion via resetAuthState, which also notifies false for the
|
|
465
|
-
// old config before transitioning to noAuth.
|
|
466
|
-
const onRefreshChange2 = vi.fn();
|
|
467
|
-
void client.setAuth(tokenFetcher, () => {}, onRefreshChange2);
|
|
468
|
-
|
|
469
|
-
expect(onRefreshChange).toHaveBeenCalledWith(false);
|
|
470
|
-
|
|
471
|
-
await flushPromises();
|
|
472
|
-
|
|
473
|
-
await client.close();
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
test("isRefreshing is true during reauthentication after auth error", async () => {
|
|
477
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001");
|
|
478
|
-
const tokenLifetimeSeconds = 60;
|
|
479
|
-
let tokenId = 0;
|
|
480
|
-
const tokenFetcher = vi.fn(async () =>
|
|
481
|
-
jwtEncode(
|
|
482
|
-
{ iat: 1234500, exp: 1234500 + tokenLifetimeSeconds },
|
|
483
|
-
"secret" + tokenId++,
|
|
484
|
-
),
|
|
485
|
-
);
|
|
486
|
-
|
|
487
|
-
const onRefreshChange = vi.fn();
|
|
488
|
-
void client.setAuth(tokenFetcher, () => {}, onRefreshChange);
|
|
489
|
-
|
|
490
|
-
// Wait for tokens and confirm
|
|
491
|
-
await flushPromises();
|
|
492
|
-
mockServerConfirmsAuth(client, 0);
|
|
493
|
-
await flushPromises();
|
|
494
|
-
mockServerConfirmsAuth(client, 1);
|
|
495
|
-
|
|
496
|
-
// Clear mock
|
|
497
|
-
onRefreshChange.mockClear();
|
|
498
|
-
|
|
499
|
-
// Simulate auth error from server
|
|
500
|
-
act(() => {
|
|
501
|
-
syncAsBaseConvexClient(client.sync)["authenticationManager"].onAuthError({
|
|
502
|
-
type: "AuthError",
|
|
503
|
-
error: "token expired",
|
|
504
|
-
baseVersion: 1,
|
|
505
|
-
authUpdateAttempted: false,
|
|
506
|
-
});
|
|
507
|
-
});
|
|
508
|
-
|
|
509
|
-
// Should have notified refreshing started
|
|
510
|
-
expect(onRefreshChange).toHaveBeenCalledWith(true);
|
|
511
|
-
|
|
512
|
-
// Wait for reauth token fetch
|
|
513
|
-
await flushPromises();
|
|
514
|
-
|
|
515
|
-
// Server confirms new token
|
|
516
|
-
mockServerConfirmsAuth(client, 2);
|
|
517
|
-
|
|
518
|
-
// Should have notified refreshing ended
|
|
519
|
-
expect(onRefreshChange).toHaveBeenCalledWith(false);
|
|
520
|
-
|
|
521
|
-
await client.close();
|
|
522
|
-
});
|
|
523
|
-
|
|
524
|
-
test("stop() during reauth notifies isRefreshing false", async () => {
|
|
525
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001");
|
|
526
|
-
const tokenLifetimeSeconds = 60;
|
|
527
|
-
let tokenId = 0;
|
|
528
|
-
const tokenFetcher = vi.fn(async () =>
|
|
529
|
-
jwtEncode(
|
|
530
|
-
{ iat: 1234500, exp: 1234500 + tokenLifetimeSeconds },
|
|
531
|
-
"secret" + tokenId++,
|
|
532
|
-
),
|
|
533
|
-
);
|
|
534
|
-
|
|
535
|
-
const onRefreshChange = vi.fn();
|
|
536
|
-
void client.setAuth(tokenFetcher, () => {}, onRefreshChange);
|
|
537
|
-
|
|
538
|
-
await flushPromises();
|
|
539
|
-
mockServerConfirmsAuth(client, 0);
|
|
540
|
-
await flushPromises();
|
|
541
|
-
mockServerConfirmsAuth(client, 1);
|
|
542
|
-
|
|
543
|
-
onRefreshChange.mockClear();
|
|
544
|
-
|
|
545
|
-
// Server rejects the token so isRefreshing becomes true.
|
|
546
|
-
syncAsBaseConvexClient(client.sync)["authenticationManager"].onAuthError({
|
|
547
|
-
type: "AuthError",
|
|
548
|
-
error: "token expired",
|
|
549
|
-
baseVersion: 1,
|
|
550
|
-
authUpdateAttempted: false,
|
|
551
|
-
});
|
|
552
|
-
expect(onRefreshChange).toHaveBeenCalledWith(true);
|
|
553
|
-
|
|
554
|
-
// Closing the client calls stop() on the auth manager, which calls
|
|
555
|
-
// resetAuthState() and should notify false.
|
|
556
|
-
await client.close();
|
|
557
|
-
|
|
558
|
-
expect(onRefreshChange).toHaveBeenCalledWith(false);
|
|
559
|
-
});
|
|
560
|
-
|
|
561
|
-
// --- initialAuthTokenReuse tests ---
|
|
562
|
-
// When enabled, the cached token is reused after server confirmation
|
|
563
|
-
// (no immediate fresh-token fetch), and the refetch is scheduled using
|
|
564
|
-
// the server's clientClockSkew to estimate remaining lifetime.
|
|
565
|
-
// The server computes clientClockSkew = clientTs - serverReceiveTs:
|
|
566
|
-
// negative means client behind, positive means ahead. Connect latency
|
|
567
|
-
// makes the skew more negative (conservative).
|
|
568
|
-
|
|
569
|
-
test("initialAuthTokenReuse: sends only one Authenticate", async () => {
|
|
570
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001", {
|
|
571
|
-
initialAuthTokenReuse: true,
|
|
572
|
-
});
|
|
573
|
-
const tokenLifetimeSeconds = 60;
|
|
574
|
-
let tokenId = 0;
|
|
575
|
-
const tokenFetcher = vi.fn(async () =>
|
|
576
|
-
jwtEncode(
|
|
577
|
-
{ iat: 1234500, exp: 1234500 + tokenLifetimeSeconds },
|
|
578
|
-
"secret" + tokenId++,
|
|
579
|
-
),
|
|
580
|
-
);
|
|
581
|
-
|
|
582
|
-
const sendMessageSpy = vi.spyOn(
|
|
583
|
-
syncAsBaseConvexClient(client.sync)["webSocketManager"],
|
|
584
|
-
"sendMessage",
|
|
585
|
-
);
|
|
586
|
-
|
|
587
|
-
const onAuthChange = vi.fn();
|
|
588
|
-
void client.setAuth(tokenFetcher, onAuthChange);
|
|
589
|
-
|
|
590
|
-
await flushPromises();
|
|
591
|
-
mockServerConfirmsAuth(client, 0);
|
|
592
|
-
await flushPromises();
|
|
593
|
-
|
|
594
|
-
expect(onAuthChange).toHaveBeenCalledWith(true);
|
|
595
|
-
|
|
596
|
-
const authenticateMessages = sendMessageSpy.mock.calls.filter(
|
|
597
|
-
([msg]) => msg.type === "Authenticate",
|
|
598
|
-
);
|
|
599
|
-
expect(authenticateMessages).toHaveLength(1);
|
|
600
|
-
|
|
601
|
-
await client.close();
|
|
602
|
-
});
|
|
603
|
-
|
|
604
|
-
test("initialAuthTokenReuse: clock skew adjusts schedule for partially-expired token", async () => {
|
|
605
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001", {
|
|
606
|
-
initialAuthTokenReuse: true,
|
|
607
|
-
});
|
|
608
|
-
const defaultLeewaySeconds = 10;
|
|
609
|
-
const tokenLifetimeSeconds = 60;
|
|
610
|
-
const tokenAgeOnServer = 30;
|
|
611
|
-
const clientClockSkewMs = 0;
|
|
612
|
-
const clientNow = Date.now() / 1000;
|
|
613
|
-
const serverNow = clientNow;
|
|
614
|
-
const tokenFetcher = vi.fn(async () =>
|
|
615
|
-
jwtEncode(
|
|
616
|
-
{
|
|
617
|
-
iat: serverNow - tokenAgeOnServer,
|
|
618
|
-
exp: serverNow - tokenAgeOnServer + tokenLifetimeSeconds,
|
|
619
|
-
},
|
|
620
|
-
"secret",
|
|
621
|
-
),
|
|
622
|
-
);
|
|
623
|
-
void client.setAuth(tokenFetcher, () => {});
|
|
624
|
-
|
|
625
|
-
await flushPromises();
|
|
626
|
-
mockServerConfirmsAuth(client, 0, clientClockSkewMs);
|
|
627
|
-
|
|
628
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(1);
|
|
629
|
-
|
|
630
|
-
const expectedDelay =
|
|
631
|
-
(tokenLifetimeSeconds - tokenAgeOnServer - defaultLeewaySeconds) * 1000;
|
|
632
|
-
|
|
633
|
-
vi.advanceTimersByTime(expectedDelay - 1);
|
|
634
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(1);
|
|
635
|
-
|
|
636
|
-
vi.advanceTimersByTime(1);
|
|
637
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(2);
|
|
638
|
-
});
|
|
639
|
-
|
|
640
|
-
test("initialAuthTokenReuse: clock skew triggers immediate refetch for nearly-expired token", async () => {
|
|
641
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001", {
|
|
642
|
-
initialAuthTokenReuse: true,
|
|
643
|
-
});
|
|
644
|
-
const tokenLifetimeSeconds = 60;
|
|
645
|
-
const clientClockSkewMs = -50_000;
|
|
646
|
-
const clientNow = Date.now() / 1000;
|
|
647
|
-
const serverNow = clientNow - clientClockSkewMs / 1000;
|
|
648
|
-
const tokenFetcher = vi.fn(async () =>
|
|
649
|
-
jwtEncode(
|
|
650
|
-
{
|
|
651
|
-
iat: serverNow - 55,
|
|
652
|
-
exp: serverNow - 55 + tokenLifetimeSeconds,
|
|
653
|
-
},
|
|
654
|
-
"secret",
|
|
655
|
-
),
|
|
656
|
-
);
|
|
657
|
-
void client.setAuth(tokenFetcher, () => {});
|
|
658
|
-
|
|
659
|
-
await flushPromises();
|
|
660
|
-
mockServerConfirmsAuth(client, 0, clientClockSkewMs);
|
|
661
|
-
|
|
662
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(1);
|
|
663
|
-
|
|
664
|
-
vi.advanceTimersByTime(1);
|
|
665
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(2);
|
|
666
|
-
});
|
|
667
|
-
|
|
668
|
-
test("initialAuthTokenReuse: clock skew corrects for client clock behind server", async () => {
|
|
669
|
-
const client = new ConvexReactClient("https://127.0.0.1:3001", {
|
|
670
|
-
initialAuthTokenReuse: true,
|
|
671
|
-
});
|
|
672
|
-
const defaultLeewaySeconds = 10;
|
|
673
|
-
const tokenLifetimeSeconds = 60;
|
|
674
|
-
const tokenAgeOnServer = 30;
|
|
675
|
-
const clientClockSkewMs = -20_000;
|
|
676
|
-
const clientNow = Date.now() / 1000;
|
|
677
|
-
const serverNow = clientNow - clientClockSkewMs / 1000;
|
|
678
|
-
const tokenFetcher = vi.fn(async () =>
|
|
679
|
-
jwtEncode(
|
|
680
|
-
{
|
|
681
|
-
iat: serverNow - tokenAgeOnServer,
|
|
682
|
-
exp: serverNow - tokenAgeOnServer + tokenLifetimeSeconds,
|
|
683
|
-
},
|
|
684
|
-
"secret",
|
|
685
|
-
),
|
|
686
|
-
);
|
|
687
|
-
void client.setAuth(tokenFetcher, () => {});
|
|
688
|
-
|
|
689
|
-
await flushPromises();
|
|
690
|
-
mockServerConfirmsAuth(client, 0, clientClockSkewMs);
|
|
691
|
-
|
|
692
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(1);
|
|
693
|
-
|
|
694
|
-
const expectedDelay =
|
|
695
|
-
(tokenLifetimeSeconds - tokenAgeOnServer - defaultLeewaySeconds) * 1000;
|
|
696
|
-
|
|
697
|
-
vi.advanceTimersByTime(expectedDelay - 1);
|
|
698
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(1);
|
|
699
|
-
|
|
700
|
-
vi.advanceTimersByTime(1);
|
|
701
|
-
expect(tokenFetcher).toHaveBeenCalledTimes(2);
|
|
702
|
-
});
|