handmux 0.23.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -8
- package/README.zh-CN.md +31 -8
- package/bin/handmux.js +14 -688
- package/bin/node-version.js +20 -0
- package/dist/bin/handmux.js +1015 -0
- package/dist/connectors/bridgeClient.js +385 -0
- package/dist/connectors/claude/index.js +476 -0
- package/dist/connectors/pi/bridgeClient.js +8 -0
- package/dist/connectors/pi/index.js +851 -0
- package/dist/hooks/handmux-notify.sh +64 -0
- package/{hooks → dist/hooks}/handmux-statusline.cjs +28 -6
- package/dist/hooks/handmux-write.cjs +264 -0
- package/dist/package.json +127 -0
- package/dist/public/assets/index-CTrqTqtT.css +32 -0
- package/dist/public/assets/index-DmjeMSQA.js +346 -0
- package/dist/public/assets/pcm-worklet-CxcDy7PB.js +1 -0
- package/{public → dist/public}/index.html +5 -4
- package/dist/src/agent-runtime/adapter.js +204 -0
- package/dist/src/agent-runtime/bridge.js +1006 -0
- package/dist/src/agent-runtime/bridgeStore.js +25 -0
- package/dist/src/agent-runtime/bridgeTransport.js +619 -0
- package/dist/src/agent-runtime/bridgeTypes.js +13 -0
- package/dist/src/agent-runtime/builtinRuntime.js +193 -0
- package/dist/src/agent-runtime/conversation.js +2179 -0
- package/dist/src/agent-runtime/conversationActivation.js +75 -0
- package/dist/src/agent-runtime/conversationActivity.js +69 -0
- package/dist/src/agent-runtime/conversationControls.js +206 -0
- package/dist/src/agent-runtime/conversationLiveHub.js +276 -0
- package/dist/src/agent-runtime/conversationStore.js +352 -0
- package/dist/src/agent-runtime/conversationTypes.js +1 -0
- package/dist/src/agent-runtime/conversationValidation.js +339 -0
- package/dist/src/agent-runtime/inbox.js +973 -0
- package/dist/src/agent-runtime/inboxPushProjection.js +69 -0
- package/dist/src/agent-runtime/inboxStore.js +25 -0
- package/dist/src/agent-runtime/inboxTypes.js +1 -0
- package/dist/src/agent-runtime/interaction.js +829 -0
- package/dist/src/agent-runtime/interactionLiveHub.js +225 -0
- package/dist/src/agent-runtime/interactionStore.js +18 -0
- package/dist/src/agent-runtime/interactionTypes.js +1 -0
- package/dist/src/agent-runtime/legacyInboxProjection.js +70 -0
- package/dist/src/agent-runtime/migrateLegacyCodexOutbox.js +336 -0
- package/dist/src/agent-runtime/resourceTypes.js +1 -0
- package/dist/src/agent-runtime/resources.js +245 -0
- package/dist/src/agent-runtime/run.js +328 -0
- package/dist/src/agent-runtime/runtime.js +793 -0
- package/dist/src/agent-runtime/sessionControl.js +164 -0
- package/dist/src/agent-runtime/subscriptionUsage.js +190 -0
- package/dist/src/agent-runtime/subscriptionUsageLegacy.js +18 -0
- package/dist/src/agent-runtime/tmuxRuntime.js +156 -0
- package/dist/src/agents/claude.js +203 -0
- package/dist/src/agents/claudeConversation.js +362 -0
- package/dist/src/agents/claudeInteraction.js +134 -0
- package/dist/src/agents/claudeSubscriptionUsage.js +61 -0
- package/dist/src/agents/codex.js +262 -0
- package/dist/src/agents/codexConversation.js +1103 -0
- package/dist/src/agents/codexConversationActivation.js +121 -0
- package/dist/src/agents/codexConversationControls.js +256 -0
- package/dist/src/agents/codexInteraction.js +306 -0
- package/dist/src/agents/codexSessionControl.js +118 -0
- package/dist/src/agents/codexSubscriptionUsage.js +313 -0
- package/dist/src/agents/codexTerminalControl.js +23 -0
- package/dist/src/agents/conversationProjectionSafety.js +416 -0
- package/dist/src/agents/index.js +39 -0
- package/dist/src/agents/nativeInbox.js +264 -0
- package/dist/src/agents/nativeInboxSources.js +115 -0
- package/dist/src/agents/pi.js +28 -0
- package/dist/src/agents/piConversation.js +523 -0
- package/dist/src/agents/piConversationHistory.js +502 -0
- package/dist/src/agents/piInboxBridge.js +368 -0
- package/dist/src/agents/piSessionControl.js +32 -0
- package/dist/src/agents/processIdentity.js +94 -0
- package/dist/src/agents/scanUtils.js +262 -0
- package/dist/src/apiAccountProviders.js +194 -0
- package/dist/src/apiAccounts.js +592 -0
- package/dist/src/apiErrors.js +86 -0
- package/{src → dist/src}/appName.js +12 -13
- package/dist/src/asr/iflyConfig.js +7 -0
- package/dist/src/asr/iflySign.js +14 -0
- package/dist/src/auth.js +27 -0
- package/dist/src/browser/bootstrap.js +72 -0
- package/dist/src/browser/cookieProfiles.js +413 -0
- package/dist/src/browser/coordinator.js +51 -0
- package/dist/src/browser/hammerheadCompat.js +104 -0
- package/dist/src/browser/hammerheadRedirectCompat.js +37 -0
- package/dist/src/browser/manager.js +560 -0
- package/dist/src/browser/originLabel.js +15 -0
- package/dist/src/browser/profilePersistence.js +235 -0
- package/dist/src/browser/publicProxy.js +176 -0
- package/dist/src/browser/routes.js +159 -0
- package/dist/src/browser/sessionStore.js +72 -0
- package/dist/src/browser/siteVersion.js +121 -0
- package/dist/src/browser/targetPolicy.js +163 -0
- package/{src → dist/src}/browser/worker.js +14 -18
- package/dist/src/browser/workerClient.js +286 -0
- package/dist/src/browser/workerServer.js +91 -0
- package/dist/src/captureBackground.js +95 -0
- package/dist/src/claudeEvents.js +525 -0
- package/dist/src/cli/agentIntegration.js +131 -0
- package/dist/src/cli/agentLauncher.js +26 -0
- package/dist/src/cli/claudeHooks.js +290 -0
- package/{src → dist/src}/cli/cloudflareUrl.js +2 -3
- package/dist/src/cli/cloudflared.js +106 -0
- package/dist/src/cli/codexManaged.js +80 -0
- package/{src → dist/src}/cli/cpolarUrl.js +8 -9
- package/dist/src/cli/drivers.js +98 -0
- package/dist/src/cli/hookScaffold.js +39 -0
- package/dist/src/cli/i18n/en.js +392 -0
- package/{src → dist/src}/cli/i18n/index.js +27 -25
- package/dist/src/cli/i18n/zh.js +391 -0
- package/dist/src/cli/legacyCodexHooks.js +52 -0
- package/{src → dist/src}/cli/natappUrl.js +2 -3
- package/dist/src/cli/options.js +245 -0
- package/dist/src/cli/piExtension.js +155 -0
- package/dist/src/cli/probe.js +16 -0
- package/{src → dist/src}/cli/prompt.js +4 -6
- package/dist/src/cli/pushCmd.js +102 -0
- package/{src → dist/src}/cli/qr.js +19 -19
- package/dist/src/cli/service.js +154 -0
- package/dist/src/cli/setupModel.js +194 -0
- package/dist/src/cli/setupWizard.js +647 -0
- package/dist/src/cli/shortcutEditor.js +351 -0
- package/dist/src/cli/sshTunnel.js +18 -0
- package/dist/src/cli/state.js +117 -0
- package/dist/src/cli/statusLine.js +115 -0
- package/dist/src/cli/supervisor.js +278 -0
- package/dist/src/cli/supervisorHealth.js +21 -0
- package/dist/src/cli/supervisorLaunch.js +148 -0
- package/dist/src/cli/supervisorProcesses.js +62 -0
- package/dist/src/cli/supervisorState.js +62 -0
- package/dist/src/cli/tmuxVersion.js +53 -0
- package/{src → dist/src}/cli/tunlite.js +7 -10
- package/dist/src/cli/tunnelClients.js +72 -0
- package/{src → dist/src}/cli/updateCheck.js +98 -69
- package/{src → dist/src}/cli/urlHost.js +8 -4
- package/dist/src/cli/workspaceCmd.js +347 -0
- package/dist/src/codexAppServer.js +3436 -0
- package/dist/src/codexConversationProjection.js +199 -0
- package/dist/src/codexDiff.js +118 -0
- package/dist/src/codexMessageIdentity.js +18 -0
- package/dist/src/codexPlan.js +30 -0
- package/dist/src/codexQueueProtocol.js +137 -0
- package/dist/src/codexStreamProtocol.js +207 -0
- package/dist/src/codexToolProtocol.js +68 -0
- package/dist/src/codexTranscriptParse.js +835 -0
- package/dist/src/codexUsageSnapshot.js +228 -0
- package/dist/src/config.js +8 -0
- package/{src → dist/src}/docPath.js +22 -24
- package/dist/src/docs.js +337 -0
- package/dist/src/git.js +284 -0
- package/dist/src/healthProtocol.js +97 -0
- package/dist/src/httpApi.js +96 -0
- package/dist/src/jsonStore.js +15 -0
- package/{src → dist/src}/keyNames.js +3 -3
- package/dist/src/notifications.js +111 -0
- package/dist/src/orphans.js +167 -0
- package/dist/src/paneInput.js +42 -0
- package/dist/src/pendingPrompt.js +194 -0
- package/dist/src/previewServer.js +202 -0
- package/dist/src/previews.js +179 -0
- package/dist/src/privateStateStore.js +124 -0
- package/dist/src/projectTask/backup.js +224 -0
- package/dist/src/projectTask/lock.js +108 -0
- package/dist/src/projectTask/migrations.js +90 -0
- package/dist/src/projectTask/routes.js +155 -0
- package/dist/src/projectTask/runtime.js +182 -0
- package/dist/src/projectTask/schema.js +56 -0
- package/dist/src/projectTask/store.js +457 -0
- package/dist/src/push.js +224 -0
- package/dist/src/routes/agents.js +631 -0
- package/dist/src/routes/apiAccounts.js +82 -0
- package/dist/src/routes/files.js +230 -0
- package/dist/src/routes/git.js +89 -0
- package/dist/src/routes/health.js +16 -0
- package/dist/src/routes/notifications.js +16 -0
- package/dist/src/routes/previews.js +43 -0
- package/dist/src/routes/push.js +145 -0
- package/dist/src/routes/sessions.js +244 -0
- package/dist/src/routes/system.js +220 -0
- package/dist/src/routes/terminal.js +244 -0
- package/dist/src/routes/workspace.js +267 -0
- package/dist/src/server.js +315 -0
- package/dist/src/shortcutConfig.js +83 -0
- package/{src → dist/src}/staticCache.js +5 -3
- package/{src → dist/src}/staticCompression.js +5 -6
- package/dist/src/terminalStream.js +441 -0
- package/{src → dist/src}/tmux/commands.js +185 -172
- package/dist/src/tmux/format.js +47 -0
- package/dist/src/transcriptParse.js +261 -0
- package/dist/src/transcriptReader.js +209 -0
- package/{src → dist/src}/trimCapture.js +11 -11
- package/dist/src/uploadTypes.js +31 -0
- package/dist/src/urlPolicy.js +18 -0
- package/dist/src/usagePaths.js +15 -0
- package/dist/src/workspace/agentRunner.js +301 -0
- package/dist/src/workspace/atomicJson.js +31 -0
- package/dist/src/workspace/capture.js +139 -0
- package/dist/src/workspace/checkpointer.js +228 -0
- package/dist/src/workspace/environment.js +71 -0
- package/dist/src/workspace/lock.js +137 -0
- package/dist/src/workspace/mapping.js +128 -0
- package/dist/src/workspace/operations.js +271 -0
- package/dist/src/workspace/paths.js +15 -0
- package/dist/src/workspace/planner.js +292 -0
- package/dist/src/workspace/restore.js +363 -0
- package/dist/src/workspace/runtime.js +318 -0
- package/dist/src/workspace/schema.js +156 -0
- package/dist/src/workspace/store.js +464 -0
- package/dist/src/workspace/tmuxAdapter.js +704 -0
- package/dist/src/workspaceProtocol.js +158 -0
- package/package.json +30 -17
- package/hooks/handmux-notify.sh +0 -22
- package/hooks/handmux-write.cjs +0 -78
- package/public/assets/index-C3N7OkyP.css +0 -32
- package/public/assets/index-D1DWcC5u.js +0 -337
- package/src/.gitkeep +0 -0
- package/src/agents/claude.js +0 -159
- package/src/agents/codex.js +0 -168
- package/src/agents/index.js +0 -21
- package/src/agents/processIdentity.js +0 -72
- package/src/agents/scanUtils.js +0 -225
- package/src/asr/iflyConfig.js +0 -10
- package/src/asr/iflySign.js +0 -16
- package/src/auth.js +0 -30
- package/src/browser/bootstrap.js +0 -68
- package/src/browser/cookieProfiles.js +0 -403
- package/src/browser/coordinator.js +0 -47
- package/src/browser/hammerheadCompat.js +0 -86
- package/src/browser/hammerheadRedirectCompat.js +0 -38
- package/src/browser/manager.js +0 -556
- package/src/browser/originLabel.js +0 -17
- package/src/browser/profilePersistence.js +0 -241
- package/src/browser/publicProxy.js +0 -175
- package/src/browser/routes.js +0 -154
- package/src/browser/sessionStore.js +0 -78
- package/src/browser/siteVersion.js +0 -124
- package/src/browser/targetPolicy.js +0 -137
- package/src/browser/workerClient.js +0 -253
- package/src/browser/workerServer.js +0 -98
- package/src/captureBackground.js +0 -93
- package/src/claudeEvents.js +0 -399
- package/src/cli/claudeHooks.js +0 -206
- package/src/cli/cloudflared.js +0 -99
- package/src/cli/codexManaged.js +0 -77
- package/src/cli/drivers.js +0 -97
- package/src/cli/hookScaffold.js +0 -33
- package/src/cli/i18n/en.js +0 -385
- package/src/cli/i18n/zh.js +0 -384
- package/src/cli/legacyCodexHooks.js +0 -49
- package/src/cli/options.js +0 -211
- package/src/cli/probe.js +0 -16
- package/src/cli/pushCmd.js +0 -60
- package/src/cli/service.js +0 -126
- package/src/cli/setupModel.js +0 -154
- package/src/cli/setupWizard.js +0 -506
- package/src/cli/shortcutEditor.js +0 -288
- package/src/cli/sshTunnel.js +0 -12
- package/src/cli/state.js +0 -90
- package/src/cli/statusLine.js +0 -90
- package/src/cli/supervisor.js +0 -183
- package/src/cli/supervisorProcesses.js +0 -57
- package/src/cli/tmuxVersion.js +0 -49
- package/src/cli/tunnelClients.js +0 -62
- package/src/cli/workspaceCmd.js +0 -300
- package/src/codexAppServer.js +0 -1620
- package/src/codexDiff.js +0 -108
- package/src/codexTranscriptParse.js +0 -413
- package/src/codexUsageSnapshot.cjs +0 -129
- package/src/config.js +0 -9
- package/src/docs.js +0 -228
- package/src/git.js +0 -208
- package/src/httpApi.js +0 -72
- package/src/jsonStore.js +0 -24
- package/src/notifications.js +0 -68
- package/src/orphans.js +0 -152
- package/src/pendingPrompt.js +0 -163
- package/src/previewServer.js +0 -168
- package/src/previews.js +0 -116
- package/src/push.js +0 -183
- package/src/routes/codex.js +0 -473
- package/src/routes/files.js +0 -172
- package/src/routes/git.js +0 -57
- package/src/routes/notifications.js +0 -19
- package/src/routes/previews.js +0 -35
- package/src/routes/push.js +0 -119
- package/src/routes/sessions.js +0 -168
- package/src/routes/system.js +0 -132
- package/src/routes/terminal.js +0 -210
- package/src/routes/transcript.js +0 -171
- package/src/routes/workspace.js +0 -267
- package/src/server.js +0 -186
- package/src/shortcutConfig.js +0 -75
- package/src/terminalStream.js +0 -391
- package/src/tmux/format.js +0 -45
- package/src/transcriptParse.js +0 -180
- package/src/transcriptReader.js +0 -101
- package/src/uploadTypes.js +0 -30
- package/src/urlPolicy.js +0 -14
- package/src/usage.js +0 -260
- package/src/workspace/agentRunner.js +0 -188
- package/src/workspace/atomicJson.js +0 -32
- package/src/workspace/capture.js +0 -139
- package/src/workspace/checkpointer.js +0 -187
- package/src/workspace/environment.js +0 -75
- package/src/workspace/lock.js +0 -128
- package/src/workspace/mapping.js +0 -124
- package/src/workspace/operations.js +0 -252
- package/src/workspace/paths.js +0 -16
- package/src/workspace/planner.js +0 -247
- package/src/workspace/restore.js +0 -279
- package/src/workspace/runtime.js +0 -314
- package/src/workspace/schema.js +0 -136
- package/src/workspace/store.js +0 -382
- package/src/workspace/tmuxAdapter.js +0 -554
- /package/{public → dist/public}/fonts/JetBrainsMonoNerdFontMono-Regular.woff2 +0 -0
- /package/{public → dist/public}/fonts/TWUnifont.woff2 +0 -0
- /package/{public → dist/public}/icons/apple-touch-icon.png +0 -0
- /package/{public → dist/public}/icons/badge-96.png +0 -0
- /package/{public → dist/public}/icons/icon-192-maskable.png +0 -0
- /package/{public → dist/public}/icons/icon-192.png +0 -0
- /package/{public → dist/public}/icons/icon-512-maskable.png +0 -0
- /package/{public → dist/public}/icons/icon-512.png +0 -0
- /package/{public → dist/public}/icons/logo.svg +0 -0
- /package/{public → dist/public}/manifest.webmanifest +0 -0
- /package/{public → dist/public}/offline.html +0 -0
- /package/{public → dist/public}/sw.js +0 -0
- /package/{src → dist/src}/browser/protocol.js +0 -0
- /package/{src → dist/src}/cli/cfNamed.js +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
const PATCHED = Symbol.for('handmux.hammerhead.websocket-upgrade-socket');
|
|
4
|
+
const RESPONDER_PATCHED = Symbol.for('handmux.hammerhead.websocket-mock-response');
|
|
5
|
+
const REQUEST_INFO_PATCHED = Symbol.for('handmux.hammerhead.request-info-frame-nature');
|
|
6
|
+
const recordOf = (value) => (value && (typeof value === 'object' || typeof value === 'function') ? value : null);
|
|
7
|
+
export function patchHammerheadDestinationRequest(input) {
|
|
8
|
+
const prototype = recordOf(recordOf(input)?.prototype);
|
|
9
|
+
const original = prototype?._onUpgrade;
|
|
10
|
+
if (typeof original !== 'function' || original.length !== 3) {
|
|
11
|
+
throw new Error('unsupported Hammerhead DestinationRequest._onUpgrade signature');
|
|
12
|
+
}
|
|
13
|
+
if (!prototype)
|
|
14
|
+
throw new Error('unsupported Hammerhead DestinationRequest prototype');
|
|
15
|
+
const upgrade = original;
|
|
16
|
+
if (upgrade[PATCHED])
|
|
17
|
+
return false;
|
|
18
|
+
function onUpgrade(response, socket, head) {
|
|
19
|
+
const responseRecord = recordOf(response);
|
|
20
|
+
if (responseRecord)
|
|
21
|
+
responseRecord.socket ??= socket;
|
|
22
|
+
return upgrade.call(this, response, socket, head);
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(onUpgrade, PATCHED, { value: true });
|
|
25
|
+
prototype._onUpgrade = onUpgrade;
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
export function patchHammerheadWebSocketResponder(websocketInput, headerTransformsInput) {
|
|
29
|
+
const websocket = recordOf(websocketInput);
|
|
30
|
+
const headerTransforms = recordOf(headerTransformsInput);
|
|
31
|
+
const original = websocket?.respondOnWebSocket;
|
|
32
|
+
if (typeof original !== 'function') {
|
|
33
|
+
throw new Error('unsupported Hammerhead WebSocket responder');
|
|
34
|
+
}
|
|
35
|
+
if (!websocket)
|
|
36
|
+
throw new Error('unsupported Hammerhead WebSocket module');
|
|
37
|
+
const respond = original;
|
|
38
|
+
if (respond[RESPONDER_PATCHED])
|
|
39
|
+
return false;
|
|
40
|
+
function respondOnWebSocket(ctx) {
|
|
41
|
+
const context = recordOf(ctx);
|
|
42
|
+
const response = recordOf(context?.res);
|
|
43
|
+
const destination = recordOf(context?.destRes);
|
|
44
|
+
if (destination?.socket)
|
|
45
|
+
return respond(ctx);
|
|
46
|
+
if (!destination || typeof response?.end !== 'function')
|
|
47
|
+
return respond(ctx);
|
|
48
|
+
if (typeof headerTransforms?.forResponse !== 'function')
|
|
49
|
+
throw new Error('unsupported Hammerhead header transforms');
|
|
50
|
+
const headers = recordOf(headerTransforms.forResponse(ctx)) ?? {};
|
|
51
|
+
const missingUpgradeSocket = destination.statusCode === 101;
|
|
52
|
+
const statusCode = missingUpgradeSocket ? 502 : destination.statusCode || 502;
|
|
53
|
+
const statusMessage = missingUpgradeSocket ? 'Bad Gateway' : destination.statusMessage || 'Bad Gateway';
|
|
54
|
+
const lines = [`HTTP/${destination.httpVersion || '1.1'} ${statusCode} ${statusMessage}`];
|
|
55
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
56
|
+
if (Array.isArray(value))
|
|
57
|
+
value.forEach((item) => lines.push(`${name}: ${item}`));
|
|
58
|
+
else if (value != null)
|
|
59
|
+
lines.push(`${name}: ${value}`);
|
|
60
|
+
}
|
|
61
|
+
if (!Object.keys(headers).some((name) => name.toLowerCase() === 'connection')) {
|
|
62
|
+
lines.push('connection: close');
|
|
63
|
+
}
|
|
64
|
+
response.end(`${lines.join('\r\n')}\r\n\r\n`);
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
Object.defineProperty(respondOnWebSocket, RESPONDER_PATCHED, { value: true });
|
|
68
|
+
websocket.respondOnWebSocket = respondOnWebSocket;
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
export function patchHammerheadRequestInfo(input) {
|
|
72
|
+
const RequestInfo = recordOf(input);
|
|
73
|
+
const original = RequestInfo?.from;
|
|
74
|
+
if (typeof original !== 'function') {
|
|
75
|
+
throw new Error('unsupported Hammerhead RequestInfo.from');
|
|
76
|
+
}
|
|
77
|
+
if (!RequestInfo)
|
|
78
|
+
throw new Error('unsupported Hammerhead RequestInfo');
|
|
79
|
+
const createInfo = original;
|
|
80
|
+
if (createInfo[REQUEST_INFO_PATCHED])
|
|
81
|
+
return false;
|
|
82
|
+
function from(ctx) {
|
|
83
|
+
const info = createInfo.call(this, ctx);
|
|
84
|
+
const infoRecord = recordOf(info);
|
|
85
|
+
if (!infoRecord)
|
|
86
|
+
throw new Error('invalid Hammerhead RequestInfo result');
|
|
87
|
+
infoRecord.isIframe = Boolean(recordOf(ctx)?.isIframe);
|
|
88
|
+
return info;
|
|
89
|
+
}
|
|
90
|
+
Object.defineProperty(from, REQUEST_INFO_PATCHED, { value: true });
|
|
91
|
+
RequestInfo.from = from;
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
export function installHammerheadWebSocketUpgradeCompat() {
|
|
95
|
+
const DestinationRequest = require('testcafe-hammerhead/lib/request-pipeline/destination-request');
|
|
96
|
+
const websocket = require('testcafe-hammerhead/lib/request-pipeline/websocket');
|
|
97
|
+
const headerTransforms = require('testcafe-hammerhead/lib/request-pipeline/header-transforms');
|
|
98
|
+
const infoModule = require('testcafe-hammerhead/lib/request-pipeline/request-hooks/events/info');
|
|
99
|
+
const RequestInfo = recordOf(infoModule)?.RequestInfo;
|
|
100
|
+
const destinationPatched = patchHammerheadDestinationRequest(DestinationRequest);
|
|
101
|
+
const responderPatched = patchHammerheadWebSocketResponder(websocket, headerTransforms);
|
|
102
|
+
const requestInfoPatched = patchHammerheadRequestInfo(RequestInfo);
|
|
103
|
+
return destinationPatched || responderPatched || requestInfoPatched;
|
|
104
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { randomBytes } from 'node:crypto';
|
|
3
|
+
const require = createRequire(import.meta.url);
|
|
4
|
+
const MARKER = 'x-handmux-browser-rebind';
|
|
5
|
+
const MARKER_SECRET = randomBytes(32).toString('base64url');
|
|
6
|
+
const PATCHED = Symbol.for('handmux.hammerhead.raw-rebind-location');
|
|
7
|
+
const recordOf = (value) => (value && typeof value === 'object' ? value : null);
|
|
8
|
+
export function hammerheadRebindHeaders(location) {
|
|
9
|
+
return { location, [MARKER]: MARKER_SECRET };
|
|
10
|
+
}
|
|
11
|
+
export function patchHammerheadRebindLocation(input, markerSecret = MARKER_SECRET) {
|
|
12
|
+
const responseTransforms = recordOf(input);
|
|
13
|
+
const original = responseTransforms?.location;
|
|
14
|
+
if (typeof original !== 'function')
|
|
15
|
+
throw new Error('unsupported Hammerhead location transform');
|
|
16
|
+
if (!responseTransforms)
|
|
17
|
+
throw new Error('unsupported Hammerhead response transforms');
|
|
18
|
+
const transform = original;
|
|
19
|
+
if (transform[PATCHED])
|
|
20
|
+
return false;
|
|
21
|
+
function location(src, ctx) {
|
|
22
|
+
const destination = recordOf(recordOf(ctx)?.destRes);
|
|
23
|
+
const headers = recordOf(destination?.headers);
|
|
24
|
+
if (headers?.[MARKER] === markerSecret)
|
|
25
|
+
return src;
|
|
26
|
+
return transform(src, ctx);
|
|
27
|
+
}
|
|
28
|
+
Object.defineProperty(location, PATCHED, { value: true });
|
|
29
|
+
responseTransforms.location = location;
|
|
30
|
+
responseTransforms[MARKER] = () => undefined;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
export function installHammerheadRebindLocationCompat() {
|
|
34
|
+
const loaded = require('testcafe-hammerhead/lib/request-pipeline/header-transforms/transforms');
|
|
35
|
+
return patchHammerheadRebindLocation(recordOf(loaded)?.responseTransforms, MARKER_SECRET);
|
|
36
|
+
}
|
|
37
|
+
export { MARKER as HAMMERHEAD_REBIND_HEADER };
|