pi-harness-runtime 1.1.439 → 1.1.441
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/harness/e2e/auto-test-loop.ts +8 -2
- package/harness/e2e/browser-scrapers/base-browser-scraper.ts +2 -0
- package/harness/e2e/browser-scrapers/chrome-profile-manager.ts +2 -0
- package/harness/e2e/browser-scrapers/codex-browser-scraper.ts +2 -0
- package/harness/e2e/tools-detector.ts +2 -0
- package/harness/index.ts +2 -1
- package/harness/key-loader.ts +2 -0
- package/harness/langchain/checkpointer.ts +2 -0
- package/harness/langchain/cron-cli.ts +2 -0
- package/harness/langchain/graph.ts +2 -0
- package/harness/master-planner.ts +1 -1
- package/harness/notification-center.ts +2 -0
- package/harness/output-limit-handler.ts +1 -1
- package/harness/project-detector/detector.ts +2 -4
- package/harness/secret-provider.ts +2 -0
- package/harness/task-graph.ts +460 -113
- package/index.ts +16 -7
- package/package.json +7 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/dist/extension.d.ts.map +1 -1
- package/packages/agent-policy/dist/extension.js +2 -0
- package/packages/agent-policy/dist/extension.js.map +1 -1
- package/packages/agent-policy/package.json +1 -1
- package/packages/agent-policy/src/extension.ts +2 -0
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/dist/minimax-browser-auth.d.ts.map +1 -1
- package/packages/auth/dist/minimax-browser-auth.js +23 -1
- package/packages/auth/dist/minimax-browser-auth.js.map +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/auth/src/minimax-browser-auth.ts +30 -5
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/dist/inbox.d.ts.map +1 -1
- package/packages/autonomous-runtime/dist/inbox.js +2 -0
- package/packages/autonomous-runtime/dist/inbox.js.map +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/autonomous-runtime/src/inbox.ts +2 -0
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/dist/src/clipboard.d.ts.map +1 -1
- package/packages/clipboard/dist/src/clipboard.js +2 -0
- package/packages/clipboard/dist/src/clipboard.js.map +1 -1
- package/packages/clipboard/dist/src/copy-sync.d.ts.map +1 -1
- package/packages/clipboard/dist/src/copy-sync.js +2 -0
- package/packages/clipboard/dist/src/copy-sync.js.map +1 -1
- package/packages/clipboard/dist/src/gist-relay.d.ts.map +1 -1
- package/packages/clipboard/dist/src/gist-relay.js +2 -0
- package/packages/clipboard/dist/src/gist-relay.js.map +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard/src/clipboard.ts +2 -0
- package/packages/clipboard/src/copy-sync.ts +2 -0
- package/packages/clipboard/src/gist-relay.ts +2 -0
- package/packages/clipboard-plugin/dist/types.d.ts +9 -2
- package/packages/clipboard-plugin/dist/types.d.ts.map +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/clipboard-plugin/src/types.ts +9 -2
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/connection-runtime/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/contracts/dist/delegation-store.js +1 -4
- package/packages/contracts/dist/workspace-env.js +28 -1
- package/packages/contracts/package.json +1 -1
- package/packages/contracts/src/delegation-store.ts +9 -4
- package/packages/contracts/src/workspace-env.ts +29 -4
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/durable-review/package.json +1 -1
- package/packages/e2e-tester/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-sink/package.json +1 -1
- package/packages/event-store/dist/src/store.d.ts.map +1 -1
- package/packages/event-store/dist/src/store.js +2 -0
- package/packages/event-store/dist/src/store.js.map +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/event-store/src/store.ts +3 -0
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/dist/analyzer.d.ts.map +1 -1
- package/packages/generic-web-plugin/dist/analyzer.js +2 -0
- package/packages/generic-web-plugin/dist/analyzer.js.map +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/generic-web-plugin/src/analyzer.ts +3 -0
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/dist/mcp-client.d.ts.map +1 -1
- package/packages/knowledge-retrieval/dist/mcp-client.js +0 -1
- package/packages/knowledge-retrieval/dist/mcp-client.js.map +1 -1
- package/packages/knowledge-retrieval/package.json +1 -4
- package/packages/knowledge-retrieval/src/mcp-client.ts +0 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/logging/package.json +1 -1
- package/packages/mcp-adapter/dist/server.d.ts.map +1 -1
- package/packages/mcp-adapter/dist/server.js +2 -0
- package/packages/mcp-adapter/dist/server.js.map +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/mcp-adapter/src/server.ts +3 -0
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/dist/index.d.ts.map +1 -1
- package/packages/paperclip-integration/dist/index.js +2 -0
- package/packages/paperclip-integration/dist/index.js.map +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/paperclip-integration/src/index.ts +2 -0
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/permission-mode/package.json +1 -1
- package/packages/privilege-broker/dist/audit.d.ts.map +1 -1
- package/packages/privilege-broker/dist/audit.js +2 -0
- package/packages/privilege-broker/dist/audit.js.map +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/privilege-broker/src/audit.ts +2 -0
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/dist/compiler.d.ts.map +1 -1
- package/packages/prompt-compiler/dist/compiler.js +2 -0
- package/packages/prompt-compiler/dist/compiler.js.map +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-compiler/src/compiler.ts +2 -0
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/relay/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/dist/client.d.ts.map +1 -1
- package/packages/skill-mcp-client/dist/client.js +0 -1
- package/packages/skill-mcp-client/dist/client.js.map +1 -1
- package/packages/skill-mcp-client/package.json +1 -4
- package/packages/skill-mcp-client/src/client.ts +0 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/dist/parser.d.ts.map +1 -1
- package/packages/skills/dist/parser.js +2 -0
- package/packages/skills/dist/parser.js.map +1 -1
- package/packages/skills/dist/skill-versioning.d.ts.map +1 -1
- package/packages/skills/dist/skill-versioning.js +2 -0
- package/packages/skills/dist/skill-versioning.js.map +1 -1
- package/packages/skills/package.json +1 -1
- package/packages/skills/src/parser.ts +3 -0
- package/packages/skills/src/skill-versioning.ts +2 -0
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/tooling-preference/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/two-phase-review/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/voice-api/package.json +1 -1
- package/packages/webmcp-tester/dist/index.js +0 -2
- package/packages/webmcp-tester/package.json +1 -1
- package/packages/webmcp-tester/src/index.ts +0 -3
- package/packages/wiki/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/dist/trigger.d.ts.map +1 -1
- package/packages/write-review/dist/trigger.js +1 -2
- package/packages/write-review/dist/trigger.js.map +1 -1
- package/packages/write-review/package.json +1 -1
- package/packages/write-review/src/trigger.ts +1 -2
- package/scripts/lib/runtime-imports.ts +189 -3
- package/scripts/release-all.ts +5 -3
- package/scripts/telegram-webhook-server.ts +2 -0
- package/scripts/typecheck-packages.mjs +7 -4
- package/scripts/verify-package-contents.ts +161 -2
- package/harness/e2e/tools-detector.test.ts +0 -156
- package/harness/glm-quota-countdown.test.ts +0 -323
- package/harness/langchain/agents.test.ts +0 -39
- package/harness/langchain/checkpointer.test.ts +0 -243
- package/harness/langchain/daemon.test.ts +0 -459
- package/harness/langchain/model-router.test.ts +0 -191
- package/harness/langchain/ping-pong-middleware.test.ts +0 -69
- package/harness/langchain/scoreboard.test.ts +0 -245
- package/harness/langchain/status-line.test.ts +0 -106
- package/harness/langchain/surge.test.ts +0 -467
- package/harness/langchain/widget.test.ts +0 -251
- package/harness/skill-sync.test.ts +0 -57
- package/harness/ssh-detach-interceptor.test.ts +0 -263
- package/harness/ssh-hang-recovery.test.ts +0 -86
- package/packages/a2a-adapter/test/a2a.test.ts +0 -151
- package/packages/agent-policy/test/interlock.test.ts +0 -101
- package/packages/agent-policy/test/policy-retention.test.ts +0 -380
- package/packages/agent-policy/test/policy.test.ts +0 -387
- package/packages/auth/test/auth.test.ts +0 -238
- package/packages/autonomous-refactor/test/refactor.test.ts +0 -202
- package/packages/autonomous-runtime/test/types.test.ts +0 -95
- package/packages/cache-strategy/test/cache.test.ts +0 -137
- package/packages/capability-registry/test/registry.test.ts +0 -204
- package/packages/checkpoint/test/engine.test.ts +0 -265
- package/packages/cli-plugin-sdk/test/cli.test.ts +0 -45
- package/packages/code-generation/test/generator.test.ts +0 -238
- package/packages/code-review/test/engine.test.ts +0 -302
- package/packages/codex-adapter/test/provider.test.ts +0 -142
- package/packages/codex-watcher/test/watch.test.ts +0 -453
- package/packages/context-compiler/test/context-compiler.test.ts +0 -746
- package/packages/context-manager/test/context.test.ts +0 -198
- package/packages/contracts/test/delegation.test.ts +0 -350
- package/packages/contracts/test/workspace-env.test.ts +0 -802
- package/packages/cookie-sanitizer/test/infer.test.ts +0 -110
- package/packages/cookie-sanitizer/test/normalize.test.ts +0 -113
- package/packages/cookie-sanitizer/test/parse.test.ts +0 -204
- package/packages/cookie-sanitizer/test/sync.test.ts +0 -237
- package/packages/cookie-sanitizer/test/watcher.test.ts +0 -27
- package/packages/cost-optimizer/test/cost-optimizer.test.ts +0 -438
- package/packages/dependency-analyzer/test/analyzer.test.ts +0 -49
- package/packages/django-plugin/test/analyzer.test.ts +0 -195
- package/packages/doc-generator/test/docs.test.ts +0 -168
- package/packages/durable-review/test/acceptance.test.ts +0 -357
- package/packages/durable-review/test/smoke.test.ts +0 -107
- package/packages/evaluation-engine/test/engine.test.ts +0 -277
- package/packages/evaluation-runner/test/runner.test.ts +0 -168
- package/packages/event-bus/test/bus.test.ts +0 -100
- package/packages/event-store/test/store.test.ts +0 -115
- package/packages/experience-replay/test/replay.test.ts +0 -267
- package/packages/feedback-collector/test/collector.test.ts +0 -142
- package/packages/framework-detector/test/detector.test.ts +0 -75
- package/packages/framework-plugin-sdk/test/manager.test.ts +0 -320
- package/packages/frappe-plugin/test/analyzer.test.ts +0 -250
- package/packages/generic-web-plugin/test/analyzer.test.ts +0 -134
- package/packages/health-monitor/test/health.test.ts +0 -231
- package/packages/intent-analyzer/test/analyzer.test.ts +0 -72
- package/packages/intent-analyzer/test/ping-pong.test.ts +0 -96
- package/packages/jev-judge/tests/auto-continue-context.test.ts +0 -280
- package/packages/jev-judge/tests/continuation-controller.test.ts +0 -1396
- package/packages/jev-judge/tests/jev-provider-chain.test.ts +0 -536
- package/packages/jev-judge/tests/outcome-application.test.ts +0 -132
- package/packages/jev-judge/tests/question-risk.test.ts +0 -129
- package/packages/jev-judge/tests/typesafe-provider.test.ts +0 -640
- package/packages/jev-judge/tests/validation-ledger.test.ts +0 -181
- package/packages/jev-judge/tests/validation-plan.test.ts +0 -170
- package/packages/jev-judge/tests/validation-tie-breaker.test.ts +0 -88
- package/packages/laravel-plugin/test/analyzer.test.ts +0 -220
- package/packages/learning-engine/test/engine.test.ts +0 -331
- package/packages/logging/test/buffer.test.ts +0 -44
- package/packages/logging/test/classification.test.ts +0 -137
- package/packages/logging/test/config.test.ts +0 -97
- package/packages/logging/test/fanout.test.ts +0 -186
- package/packages/logging/test/identity-transport.test.ts +0 -197
- package/packages/logging/test/incidents.test.ts +0 -404
- package/packages/logging/test/ingest-schema.test.ts +0 -184
- package/packages/logging/test/integration.test.ts +0 -140
- package/packages/logging/test/log-http.test.ts +0 -246
- package/packages/logging/test/redact.test.ts +0 -109
- package/packages/logging/test/sampler.test.ts +0 -57
- package/packages/logging/test/server.test.ts +0 -444
- package/packages/logging/test/shipper.test.ts +0 -152
- package/packages/logging/test/spool.test.ts +0 -96
- package/packages/mcp-adapter/test/server.test.ts +0 -91
- package/packages/memory-engine/test/engine.test.ts +0 -456
- package/packages/model-registry/test/registry.test.ts +0 -342
- package/packages/nextjs-plugin/test/analyzer.test.ts +0 -149
- package/packages/notification/test/approval-payload.test.ts +0 -269
- package/packages/notification/test/detail-format.test.ts +0 -106
- package/packages/notification/test/notification.test.ts +0 -375
- package/packages/notification/test/pending-question-lifecycle.test.ts +0 -195
- package/packages/notification/test/pending-question.test.ts +0 -331
- package/packages/notification/test/tooling-proposal-payload.test.ts +0 -212
- package/packages/observability/test/observability.test.ts +0 -1350
- package/packages/performance-optimizer/test/optimizer.test.ts +0 -267
- package/packages/project-analyzer/test/index.test.ts +0 -1719
- package/packages/prompt-compiler/test/prompt-compiler.test.ts +0 -813
- package/packages/prompt-versioning/test/versioning.test.ts +0 -112
- package/packages/provider-adapter-sdk/test/sdk.test.ts +0 -220
- package/packages/provider-router/test/provider-router.test.ts +0 -405
- package/packages/provider-selector/test/selector.test.ts +0 -192
- package/packages/providers/test/providers.test.ts +0 -225
- package/packages/qdrant-skills/test/collection-info.test.ts +0 -165
- package/packages/qdrant-skills/test/embedder-batch.test.ts +0 -184
- package/packages/qdrant-skills/test/embedder.test.ts +0 -97
- package/packages/quota-manager/test/quota.test.ts +0 -432
- package/packages/rate-limiter/test/limiter.test.ts +0 -128
- package/packages/react-vite-plugin/test/analyzer.test.ts +0 -139
- package/packages/relay/test/client.test.ts +0 -446
- package/packages/relay/test/relay-e2e.test.ts +0 -299
- package/packages/relay/test/relay-endpoint.test.ts +0 -278
- package/packages/release-manager/test/release.test.ts +0 -215
- package/packages/requirement-compiler/test/requirement-compiler.test.ts +0 -743
- package/packages/runtime/test/runtime-api.test.ts +0 -169
- package/packages/runtime/test/runtime.test.ts +0 -297
- package/packages/scheduler/test/scheduler.test.ts +0 -125
- package/packages/session/test/manager.test.ts +0 -233
- package/packages/shared-context/test/shared-context.test.ts +0 -114
- package/packages/skill-registry/test/registry.test.ts +0 -508
- package/packages/skills/test/init-skills.test.ts +0 -114
- package/packages/skills/test/remote-skills.test.ts +0 -360
- package/packages/skills/test/remote-source.test.ts +0 -248
- package/packages/skills/test/sanitize.test.ts +0 -250
- package/packages/skills/test/vector-indexing.test.ts +0 -205
- package/packages/skills/test/vector-schema.test.ts +0 -180
- package/packages/skills/test/vector-threshold.test.ts +0 -108
- package/packages/sprint-planner/test/planner.test.ts +0 -187
- package/packages/task-compiler/test/task-compiler.test.ts +0 -628
- package/packages/test-data-generator/test/generator.test.ts +0 -265
- package/packages/test-generator/test/generator.test.ts +0 -156
- package/packages/token-estimation/test/token-estimation.test.ts +0 -207
- package/packages/token-optimizer/test/optimizer.test.ts +0 -141
- package/packages/tooling-preference/tests/changed-files.test.ts +0 -124
- package/packages/tooling-preference/tests/detect.test.ts +0 -188
- package/packages/tooling-preference/tests/proposal.test.ts +0 -107
- package/packages/tooling-preference/tests/quality-check.test.ts +0 -272
- package/packages/tooling-preference/tests/registry.test.ts +0 -51
- package/packages/tooling-preference/tests/store.test.ts +0 -99
- package/packages/trajectory/test/store.test.ts +0 -250
- package/packages/tui/test/harness-footer.test.ts +0 -559
- package/packages/tui/test/harness-header.test.ts +0 -590
- package/packages/two-phase-review/test/classify.test.ts +0 -102
- package/packages/two-phase-review/test/helpers.ts +0 -72
- package/packages/two-phase-review/test/rules.test.ts +0 -150
- package/packages/two-phase-review/test/runtime.test.ts +0 -362
- package/packages/two-phase-review/test/scope.test.ts +0 -186
- package/packages/two-phase-review/test/signals.test.ts +0 -183
- package/packages/two-phase-review/test/state.test.ts +0 -201
- package/packages/wiki/test/basic.test.ts +0 -242
- package/packages/workspace-scanner/test/scanner.test.ts +0 -43
- package/packages/worktree/test/worktree.test.ts +0 -163
|
@@ -1,446 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RelayClient connect() lifecycle tests.
|
|
3
|
-
*
|
|
4
|
-
* Deterministic and localhost-only: no Telegram transport, no production
|
|
5
|
-
* credentials, no external network. The fixture speaks the relay protocol
|
|
6
|
-
* directly so every handshake outcome is reproducible.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { describe, it, expect } from "bun:test";
|
|
10
|
-
import { WebSocketServer, type WebSocket } from "ws";
|
|
11
|
-
import { createServer, type Server } from "node:http";
|
|
12
|
-
import type { AddressInfo } from "node:net";
|
|
13
|
-
import { RelayClient } from "../src/client.js";
|
|
14
|
-
|
|
15
|
-
const TEST_TOKEN = "test-token-123";
|
|
16
|
-
|
|
17
|
-
type FixtureMode =
|
|
18
|
-
/** authenticate successfully, then send snapshot + synchronized */
|
|
19
|
-
| "ok"
|
|
20
|
-
/** receive the auth message but never answer it */
|
|
21
|
-
| "silent"
|
|
22
|
-
/** close the socket immediately, before authentication */
|
|
23
|
-
| "close"
|
|
24
|
-
/** answer with an explicit authentication failure */
|
|
25
|
-
| "reject";
|
|
26
|
-
|
|
27
|
-
interface Fixture {
|
|
28
|
-
url: string;
|
|
29
|
-
port: number;
|
|
30
|
-
close: () => Promise<void>;
|
|
31
|
-
connectionCount: () => number;
|
|
32
|
-
dropConnections: () => void;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async function startFixture(mode: FixtureMode): Promise<Fixture> {
|
|
36
|
-
const httpServer: Server = createServer();
|
|
37
|
-
const wss = new WebSocketServer({ server: httpServer });
|
|
38
|
-
await new Promise<void>((resolve) => httpServer.listen(0, "127.0.0.1", () => resolve()));
|
|
39
|
-
const port = (httpServer.address() as AddressInfo).port;
|
|
40
|
-
|
|
41
|
-
let connections = 0;
|
|
42
|
-
|
|
43
|
-
wss.on("connection", (ws: WebSocket) => {
|
|
44
|
-
connections++;
|
|
45
|
-
|
|
46
|
-
if (mode === "close") {
|
|
47
|
-
ws.close();
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
ws.on("message", (data) => {
|
|
52
|
-
let msg: { type?: string; payload?: { token?: string } };
|
|
53
|
-
try {
|
|
54
|
-
msg = JSON.parse(data.toString());
|
|
55
|
-
} catch {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
if (msg.type !== "auth") return;
|
|
59
|
-
|
|
60
|
-
if (mode === "silent") return; // never answer: caller must time out
|
|
61
|
-
|
|
62
|
-
if (mode === "reject" || msg.payload?.token !== TEST_TOKEN) {
|
|
63
|
-
ws.send(
|
|
64
|
-
JSON.stringify({
|
|
65
|
-
version: 1,
|
|
66
|
-
type: "auth",
|
|
67
|
-
payload: { success: false, error: "Invalid token" },
|
|
68
|
-
}),
|
|
69
|
-
);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
ws.send(
|
|
74
|
-
JSON.stringify({
|
|
75
|
-
version: 1,
|
|
76
|
-
type: "auth",
|
|
77
|
-
payload: { success: true, sessionId: "sess-fixture-1" },
|
|
78
|
-
}),
|
|
79
|
-
);
|
|
80
|
-
ws.send(
|
|
81
|
-
JSON.stringify({
|
|
82
|
-
version: 1,
|
|
83
|
-
type: "snapshot",
|
|
84
|
-
payload: {
|
|
85
|
-
sessionId: "sess-fixture-1",
|
|
86
|
-
serverVersion: "fixture",
|
|
87
|
-
connectedClients: 1,
|
|
88
|
-
recentCallbacks: [],
|
|
89
|
-
},
|
|
90
|
-
}),
|
|
91
|
-
);
|
|
92
|
-
ws.send(JSON.stringify({ version: 1, type: "synchronized", payload: {} }));
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
return {
|
|
97
|
-
url: `ws://127.0.0.1:${port}`,
|
|
98
|
-
port,
|
|
99
|
-
connectionCount: () => connections,
|
|
100
|
-
dropConnections: () => {
|
|
101
|
-
for (const client of wss.clients) client.close();
|
|
102
|
-
},
|
|
103
|
-
close: () =>
|
|
104
|
-
new Promise<void>((resolve) => {
|
|
105
|
-
for (const client of wss.clients) client.terminate();
|
|
106
|
-
wss.close();
|
|
107
|
-
// Never let a stuck socket hang the test run
|
|
108
|
-
const guard = setTimeout(resolve, 500);
|
|
109
|
-
httpServer.close(() => {
|
|
110
|
-
clearTimeout(guard);
|
|
111
|
-
resolve();
|
|
112
|
-
});
|
|
113
|
-
}),
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
|
|
118
|
-
|
|
119
|
-
describe("RelayClient.connect", () => {
|
|
120
|
-
it("resolves once the server confirms authentication", async () => {
|
|
121
|
-
const fixture = await startFixture("ok");
|
|
122
|
-
const connected: string[] = [];
|
|
123
|
-
const client = new RelayClient(
|
|
124
|
-
{ serverUrl: fixture.url, token: TEST_TOKEN, connectTimeout: 2000 },
|
|
125
|
-
{ onConnected: (sessionId) => connected.push(sessionId) },
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
await client.connect();
|
|
129
|
-
|
|
130
|
-
expect(client.getState().state).toBe("connected");
|
|
131
|
-
expect(client.getSessionId()).toBe("sess-fixture-1");
|
|
132
|
-
expect(connected).toEqual(["sess-fixture-1"]);
|
|
133
|
-
|
|
134
|
-
client.disconnect();
|
|
135
|
-
await fixture.close();
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it("writes its diagnostics to the injected logger, never to the console", async () => {
|
|
139
|
-
const fixture = await startFixture("ok");
|
|
140
|
-
const logged: string[] = [];
|
|
141
|
-
const consoleWrites: string[] = [];
|
|
142
|
-
const originalLog = console.log;
|
|
143
|
-
const originalWarn = console.warn;
|
|
144
|
-
const originalError = console.error;
|
|
145
|
-
console.log = (...args: unknown[]) => {
|
|
146
|
-
consoleWrites.push(args.map(String).join(" "));
|
|
147
|
-
};
|
|
148
|
-
console.warn = console.log;
|
|
149
|
-
console.error = console.log;
|
|
150
|
-
|
|
151
|
-
try {
|
|
152
|
-
const client = new RelayClient(
|
|
153
|
-
{ serverUrl: fixture.url, token: TEST_TOKEN, connectTimeout: 2000 },
|
|
154
|
-
{},
|
|
155
|
-
{
|
|
156
|
-
log: (message) => logged.push(message),
|
|
157
|
-
warn: (message) => logged.push(message),
|
|
158
|
-
error: (message) => logged.push(message),
|
|
159
|
-
},
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
await client.connect();
|
|
163
|
-
client.disconnect();
|
|
164
|
-
await fixture.close();
|
|
165
|
-
} finally {
|
|
166
|
-
console.log = originalLog;
|
|
167
|
-
console.warn = originalWarn;
|
|
168
|
-
console.error = originalError;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// The TUI owns the terminal: nothing may reach the console.
|
|
172
|
-
expect(consoleWrites.length).toBe(0);
|
|
173
|
-
expect(logged.some((message) => message.includes("[RelayClient]"))).toBe(true);
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it("routes a partial logger to the levels it has, never to the console", async () => {
|
|
177
|
-
const fixture = await startFixture("ok");
|
|
178
|
-
const logged: string[] = [];
|
|
179
|
-
const consoleWrites: string[] = [];
|
|
180
|
-
const originalLog = console.log;
|
|
181
|
-
const originalWarn = console.warn;
|
|
182
|
-
const originalError = console.error;
|
|
183
|
-
console.log = (...args: unknown[]) => {
|
|
184
|
-
consoleWrites.push(args.map(String).join(" "));
|
|
185
|
-
};
|
|
186
|
-
console.warn = console.log;
|
|
187
|
-
console.error = console.log;
|
|
188
|
-
|
|
189
|
-
try {
|
|
190
|
-
// Only "log" is provided: a warning must NOT reach the console.
|
|
191
|
-
const client = new RelayClient(
|
|
192
|
-
{ serverUrl: fixture.url, token: TEST_TOKEN, connectTimeout: 2000 },
|
|
193
|
-
{},
|
|
194
|
-
{ log: (message) => logged.push(message) },
|
|
195
|
-
);
|
|
196
|
-
|
|
197
|
-
await client.connect();
|
|
198
|
-
client.disconnect();
|
|
199
|
-
await fixture.close();
|
|
200
|
-
} finally {
|
|
201
|
-
console.log = originalLog;
|
|
202
|
-
console.warn = originalWarn;
|
|
203
|
-
console.error = originalError;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
expect(consoleWrites.length).toBe(0);
|
|
207
|
-
expect(logged.length).toBeGreaterThan(0);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it("never reaches the console for any partial logger shape", async () => {
|
|
211
|
-
const shapes: Array<{ name: string; logger: { log?: (m: string) => void; warn?: (m: string) => void; error?: (m: string) => void } }> = [
|
|
212
|
-
{ name: "only log", logger: { log: () => {} } },
|
|
213
|
-
{ name: "only warn", logger: { warn: () => {} } },
|
|
214
|
-
{ name: "only error", logger: { error: () => {} } },
|
|
215
|
-
{ name: "log + error", logger: { log: () => {}, error: () => {} } },
|
|
216
|
-
];
|
|
217
|
-
|
|
218
|
-
for (const shape of shapes) {
|
|
219
|
-
const fixture = await startFixture("ok");
|
|
220
|
-
const consoleWrites: string[] = [];
|
|
221
|
-
const originalLog = console.log;
|
|
222
|
-
const originalWarn = console.warn;
|
|
223
|
-
const originalError = console.error;
|
|
224
|
-
console.log = (...args: unknown[]) => {
|
|
225
|
-
consoleWrites.push(args.map(String).join(" "));
|
|
226
|
-
};
|
|
227
|
-
console.warn = console.log;
|
|
228
|
-
console.error = console.log;
|
|
229
|
-
|
|
230
|
-
try {
|
|
231
|
-
const client = new RelayClient(
|
|
232
|
-
{ serverUrl: fixture.url, token: TEST_TOKEN, connectTimeout: 2000 },
|
|
233
|
-
{},
|
|
234
|
-
shape.logger,
|
|
235
|
-
);
|
|
236
|
-
|
|
237
|
-
await client.connect();
|
|
238
|
-
client.disconnect();
|
|
239
|
-
await fixture.close();
|
|
240
|
-
} finally {
|
|
241
|
-
console.log = originalLog;
|
|
242
|
-
console.warn = originalWarn;
|
|
243
|
-
console.error = originalError;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
expect(consoleWrites.length).toBe(0);
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
it("survives a logger that throws", async () => {
|
|
251
|
-
const fixture = await startFixture("ok");
|
|
252
|
-
let calls = 0;
|
|
253
|
-
const broken = (): void => {
|
|
254
|
-
calls++;
|
|
255
|
-
throw new Error("logger is broken");
|
|
256
|
-
};
|
|
257
|
-
const client = new RelayClient(
|
|
258
|
-
{ serverUrl: fixture.url, token: TEST_TOKEN, connectTimeout: 2000 },
|
|
259
|
-
{},
|
|
260
|
-
{ log: broken, warn: broken, error: broken },
|
|
261
|
-
);
|
|
262
|
-
|
|
263
|
-
await client.connect();
|
|
264
|
-
expect(client.getState().state).toBe("connected");
|
|
265
|
-
// The logger really ran (the test would be vacuous otherwise).
|
|
266
|
-
expect(calls).toBeGreaterThan(0);
|
|
267
|
-
|
|
268
|
-
client.disconnect();
|
|
269
|
-
await fixture.close();
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
it("rejects when the server never answers authentication", async () => {
|
|
273
|
-
const fixture = await startFixture("silent");
|
|
274
|
-
const client = new RelayClient({
|
|
275
|
-
serverUrl: fixture.url,
|
|
276
|
-
token: TEST_TOKEN,
|
|
277
|
-
connectTimeout: 250,
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
await expect(client.connect()).rejects.toThrow(/timeout/i);
|
|
281
|
-
|
|
282
|
-
client.disconnect();
|
|
283
|
-
await fixture.close();
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
it("rejects with the server error when authentication fails", async () => {
|
|
287
|
-
const fixture = await startFixture("reject");
|
|
288
|
-
const errors: Error[] = [];
|
|
289
|
-
const client = new RelayClient(
|
|
290
|
-
{ serverUrl: fixture.url, token: "wrong-token", connectTimeout: 2000 },
|
|
291
|
-
{ onError: (err) => errors.push(err) },
|
|
292
|
-
);
|
|
293
|
-
|
|
294
|
-
await expect(client.connect()).rejects.toThrow(/Invalid token/);
|
|
295
|
-
expect(errors.length).toBeGreaterThan(0);
|
|
296
|
-
|
|
297
|
-
await fixture.close();
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
it("rejects when the socket closes before the client is ready", async () => {
|
|
301
|
-
const fixture = await startFixture("close");
|
|
302
|
-
const client = new RelayClient({
|
|
303
|
-
serverUrl: fixture.url,
|
|
304
|
-
token: TEST_TOKEN,
|
|
305
|
-
connectTimeout: 2000,
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
await expect(client.connect()).rejects.toThrow(/closed before ready/i);
|
|
309
|
-
|
|
310
|
-
await fixture.close();
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
it("rejects when the server is unreachable", async () => {
|
|
314
|
-
// Bind and immediately release a port so nothing is listening on it
|
|
315
|
-
const fixture = await startFixture("ok");
|
|
316
|
-
const deadUrl = fixture.url;
|
|
317
|
-
await fixture.close();
|
|
318
|
-
|
|
319
|
-
const client = new RelayClient({
|
|
320
|
-
serverUrl: deadUrl,
|
|
321
|
-
token: TEST_TOKEN,
|
|
322
|
-
connectTimeout: 2000,
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
await expect(client.connect()).rejects.toThrow();
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
it("rejects a pending connect when disconnect() is called", async () => {
|
|
329
|
-
const fixture = await startFixture("silent");
|
|
330
|
-
const client = new RelayClient({
|
|
331
|
-
serverUrl: fixture.url,
|
|
332
|
-
token: TEST_TOKEN,
|
|
333
|
-
connectTimeout: 5000,
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
const pending = client.connect();
|
|
337
|
-
await sleep(50);
|
|
338
|
-
client.disconnect();
|
|
339
|
-
|
|
340
|
-
await expect(pending).rejects.toThrow(/Disconnected/);
|
|
341
|
-
|
|
342
|
-
await fixture.close();
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
it("reconnects after an unexpected drop and stops after disconnect()", async () => {
|
|
346
|
-
const fixture = await startFixture("ok");
|
|
347
|
-
const client = new RelayClient({
|
|
348
|
-
serverUrl: fixture.url,
|
|
349
|
-
token: TEST_TOKEN,
|
|
350
|
-
connectTimeout: 2000,
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
await client.connect();
|
|
354
|
-
expect(fixture.connectionCount()).toBe(1);
|
|
355
|
-
|
|
356
|
-
// Unexpected loss of the connection -> the client should reconnect
|
|
357
|
-
fixture.dropConnections();
|
|
358
|
-
await sleep(1600);
|
|
359
|
-
expect(fixture.connectionCount()).toBe(2);
|
|
360
|
-
|
|
361
|
-
// Deliberate shutdown must not schedule another reconnect
|
|
362
|
-
client.disconnect();
|
|
363
|
-
await sleep(1600);
|
|
364
|
-
expect(fixture.connectionCount()).toBe(2);
|
|
365
|
-
|
|
366
|
-
await fixture.close();
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
it("stops heartbeat activity after disconnect()", async () => {
|
|
370
|
-
const fixture = await startFixture("ok");
|
|
371
|
-
const client = new RelayClient({
|
|
372
|
-
serverUrl: fixture.url,
|
|
373
|
-
token: TEST_TOKEN,
|
|
374
|
-
keepAlive: 50,
|
|
375
|
-
connectTimeout: 2000,
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
await client.connect();
|
|
379
|
-
client.disconnect();
|
|
380
|
-
|
|
381
|
-
const before = fixture.connectionCount();
|
|
382
|
-
await sleep(300);
|
|
383
|
-
expect(fixture.connectionCount()).toBe(before);
|
|
384
|
-
|
|
385
|
-
await fixture.close();
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
it("opens a NEW socket when connect() follows a disconnect()", async () => {
|
|
389
|
-
// Regression: connect() used to hand out the already-settled promise, so
|
|
390
|
-
// `disconnect(); connect();` never opened a second socket.
|
|
391
|
-
const fixture = await startFixture("ok");
|
|
392
|
-
const client = new RelayClient({
|
|
393
|
-
serverUrl: fixture.url,
|
|
394
|
-
token: TEST_TOKEN,
|
|
395
|
-
connectTimeout: 2000,
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
const first = client.connect();
|
|
399
|
-
client.disconnect();
|
|
400
|
-
await expect(first).rejects.toThrow(/Disconnected/);
|
|
401
|
-
|
|
402
|
-
await client.connect();
|
|
403
|
-
expect(client.getState().state).toBe("connected");
|
|
404
|
-
expect(client.getSessionId()).toBe("sess-fixture-1");
|
|
405
|
-
// The first socket was closed before the handshake completed, so the
|
|
406
|
-
// server only ever saw the NEW one.
|
|
407
|
-
expect(fixture.connectionCount()).toBeGreaterThanOrEqual(1);
|
|
408
|
-
|
|
409
|
-
client.disconnect();
|
|
410
|
-
await fixture.close();
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
it("does not retry a failed connect by default", async () => {
|
|
414
|
-
const fixture = await startFixture("close");
|
|
415
|
-
const client = new RelayClient({
|
|
416
|
-
serverUrl: fixture.url,
|
|
417
|
-
token: TEST_TOKEN,
|
|
418
|
-
connectTimeout: 1000,
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
await expect(client.connect()).rejects.toThrow(/closed before ready/i);
|
|
422
|
-
await sleep(1400);
|
|
423
|
-
expect(fixture.connectionCount()).toBe(1);
|
|
424
|
-
|
|
425
|
-
client.disconnect();
|
|
426
|
-
await fixture.close();
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
it("retries a failed connect when retryOnConnectFailure is enabled", async () => {
|
|
430
|
-
const fixture = await startFixture("close");
|
|
431
|
-
const client = new RelayClient({
|
|
432
|
-
serverUrl: fixture.url,
|
|
433
|
-
token: TEST_TOKEN,
|
|
434
|
-
connectTimeout: 1000,
|
|
435
|
-
retryOnConnectFailure: true,
|
|
436
|
-
});
|
|
437
|
-
|
|
438
|
-
await expect(client.connect()).rejects.toThrow(/closed before ready/i);
|
|
439
|
-
// The backoff starts at 1000ms.
|
|
440
|
-
await sleep(1600);
|
|
441
|
-
expect(fixture.connectionCount()).toBeGreaterThan(1);
|
|
442
|
-
|
|
443
|
-
client.disconnect();
|
|
444
|
-
await fixture.close();
|
|
445
|
-
});
|
|
446
|
-
});
|