@ytspar/sweetlink 0.0.1 → 1.0.0-canary.2b99e1e
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/LICENSE +21 -0
- package/README.md +579 -28
- package/dist/browser/SweetlinkBridge.d.ts +69 -0
- package/dist/browser/SweetlinkBridge.d.ts.map +1 -0
- package/dist/browser/SweetlinkBridge.js +360 -0
- package/dist/browser/SweetlinkBridge.js.map +1 -0
- package/dist/browser/commands/dom.d.ts +11 -0
- package/dist/browser/commands/dom.d.ts.map +1 -0
- package/dist/browser/commands/dom.js +79 -0
- package/dist/browser/commands/dom.js.map +1 -0
- package/dist/browser/commands/exec.d.ts +14 -0
- package/dist/browser/commands/exec.d.ts.map +1 -0
- package/dist/browser/commands/exec.js +47 -0
- package/dist/browser/commands/exec.js.map +1 -0
- package/dist/browser/commands/index.d.ts +10 -0
- package/dist/browser/commands/index.d.ts.map +1 -0
- package/dist/browser/commands/index.js +10 -0
- package/dist/browser/commands/index.js.map +1 -0
- package/dist/browser/commands/logs.d.ts +11 -0
- package/dist/browser/commands/logs.d.ts.map +1 -0
- package/dist/browser/commands/logs.js +25 -0
- package/dist/browser/commands/logs.js.map +1 -0
- package/dist/browser/commands/screenshot.d.ts +16 -0
- package/dist/browser/commands/screenshot.d.ts.map +1 -0
- package/dist/browser/commands/screenshot.js +118 -0
- package/dist/browser/commands/screenshot.js.map +1 -0
- package/dist/browser/consoleCapture.d.ts +107 -0
- package/dist/browser/consoleCapture.d.ts.map +1 -0
- package/dist/browser/consoleCapture.js +215 -0
- package/dist/browser/consoleCapture.js.map +1 -0
- package/dist/browser/hmr.d.ts +25 -0
- package/dist/browser/hmr.d.ts.map +1 -0
- package/dist/browser/hmr.js +97 -0
- package/dist/browser/hmr.js.map +1 -0
- package/dist/browser/screenshotUtils.d.ts +102 -0
- package/dist/browser/screenshotUtils.d.ts.map +1 -0
- package/dist/browser/screenshotUtils.js +143 -0
- package/dist/browser/screenshotUtils.js.map +1 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +5 -0
- package/dist/browser.js.map +1 -0
- package/dist/cdp.d.ts +99 -0
- package/dist/cdp.d.ts.map +1 -0
- package/dist/cdp.js +347 -0
- package/dist/cdp.js.map +1 -0
- package/dist/cli/sweetlink-dev.d.ts +14 -0
- package/dist/cli/sweetlink-dev.d.ts.map +1 -0
- package/dist/cli/sweetlink-dev.js +36 -0
- package/dist/cli/sweetlink-dev.js.map +1 -0
- package/dist/cli/sweetlink.d.ts +9 -0
- package/dist/cli/sweetlink.d.ts.map +1 -0
- package/dist/cli/sweetlink.js +1018 -0
- package/dist/cli/sweetlink.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/playwright.d.ts +29 -0
- package/dist/playwright.d.ts.map +1 -0
- package/dist/playwright.js +172 -0
- package/dist/playwright.js.map +1 -0
- package/dist/ruler.d.ts +82 -0
- package/dist/ruler.d.ts.map +1 -0
- package/dist/ruler.js +293 -0
- package/dist/ruler.js.map +1 -0
- package/dist/server/anthropic.d.ts +19 -0
- package/dist/server/anthropic.d.ts.map +1 -0
- package/dist/server/anthropic.js +26 -0
- package/dist/server/anthropic.js.map +1 -0
- package/dist/server/constants.d.ts +17 -0
- package/dist/server/constants.d.ts.map +1 -0
- package/dist/server/constants.js +17 -0
- package/dist/server/constants.js.map +1 -0
- package/dist/server/handlers/designReview.d.ts +27 -0
- package/dist/server/handlers/designReview.d.ts.map +1 -0
- package/dist/server/handlers/designReview.js +165 -0
- package/dist/server/handlers/designReview.js.map +1 -0
- package/dist/server/handlers/hmr.d.ts +21 -0
- package/dist/server/handlers/hmr.d.ts.map +1 -0
- package/dist/server/handlers/hmr.js +81 -0
- package/dist/server/handlers/hmr.js.map +1 -0
- package/dist/server/handlers/index.d.ts +12 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/index.js +12 -0
- package/dist/server/handlers/index.js.map +1 -0
- package/dist/server/handlers/outline.d.ts +19 -0
- package/dist/server/handlers/outline.d.ts.map +1 -0
- package/dist/server/handlers/outline.js +41 -0
- package/dist/server/handlers/outline.js.map +1 -0
- package/dist/server/handlers/schema.d.ts +19 -0
- package/dist/server/handlers/schema.d.ts.map +1 -0
- package/dist/server/handlers/schema.js +49 -0
- package/dist/server/handlers/schema.js.map +1 -0
- package/dist/server/handlers/screenshot.d.ts +51 -0
- package/dist/server/handlers/screenshot.d.ts.map +1 -0
- package/dist/server/handlers/screenshot.js +101 -0
- package/dist/server/handlers/screenshot.js.map +1 -0
- package/dist/server/handlers/settings.d.ts +53 -0
- package/dist/server/handlers/settings.d.ts.map +1 -0
- package/dist/server/handlers/settings.js +69 -0
- package/dist/server/handlers/settings.js.map +1 -0
- package/dist/server/index.d.ts +33 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +539 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/subscriptions.d.ts +26 -0
- package/dist/server/subscriptions.d.ts.map +1 -0
- package/dist/server/subscriptions.js +35 -0
- package/dist/server/subscriptions.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +8 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +132 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/urlUtils.d.ts +75 -0
- package/dist/urlUtils.d.ts.map +1 -0
- package/dist/urlUtils.js +121 -0
- package/dist/urlUtils.js.map +1 -0
- package/dist/viewportUtils.d.ts +51 -0
- package/dist/viewportUtils.d.ts.map +1 -0
- package/dist/viewportUtils.js +70 -0
- package/dist/viewportUtils.js.map +1 -0
- package/package.json +99 -6
- package/scripts/setup-claude-context.mjs +101 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SweetlinkBridge - Vanilla JS WebSocket bridge for browser-side Sweetlink integration
|
|
3
|
+
*
|
|
4
|
+
* This module provides framework-agnostic browser integration for Sweetlink,
|
|
5
|
+
* eliminating the React dependency to avoid conflicts with host applications.
|
|
6
|
+
*
|
|
7
|
+
* @version 2.1.0
|
|
8
|
+
*/
|
|
9
|
+
import type { ServerInfo } from '../types.js';
|
|
10
|
+
export interface SweetlinkBridgeConfig {
|
|
11
|
+
basePort?: number;
|
|
12
|
+
maxPortRetries?: number;
|
|
13
|
+
hmrScreenshots?: boolean;
|
|
14
|
+
hmrDebounceMs?: number;
|
|
15
|
+
hmrCaptureDelay?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class SweetlinkBridge {
|
|
18
|
+
private ws;
|
|
19
|
+
private connected;
|
|
20
|
+
private serverInfo;
|
|
21
|
+
private verified;
|
|
22
|
+
private consoleLogs;
|
|
23
|
+
private reconnectTimeout;
|
|
24
|
+
private savedScreenshotTimeout;
|
|
25
|
+
private savedReviewTimeout;
|
|
26
|
+
private hmrState;
|
|
27
|
+
private readonly basePort;
|
|
28
|
+
private readonly maxPortRetries;
|
|
29
|
+
private readonly hmrScreenshots;
|
|
30
|
+
private readonly hmrConfig;
|
|
31
|
+
private readonly currentAppPort;
|
|
32
|
+
private cleanupFunctions;
|
|
33
|
+
private originalConsole;
|
|
34
|
+
constructor(config?: SweetlinkBridgeConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the bridge - call this to start the connection
|
|
37
|
+
*/
|
|
38
|
+
init(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Clean up and disconnect
|
|
41
|
+
*/
|
|
42
|
+
destroy(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Check if connected to server
|
|
45
|
+
*/
|
|
46
|
+
isConnected(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Get server info
|
|
49
|
+
*/
|
|
50
|
+
getServerInfo(): ServerInfo | null;
|
|
51
|
+
private setupConsoleCapture;
|
|
52
|
+
private setupErrorHandlers;
|
|
53
|
+
private connectWebSocket;
|
|
54
|
+
private handleCommand;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Initialize Sweetlink Bridge - call from host application
|
|
58
|
+
*/
|
|
59
|
+
export declare function initSweetlinkBridge(config?: SweetlinkBridgeConfig): SweetlinkBridge;
|
|
60
|
+
/**
|
|
61
|
+
* Get the global bridge instance
|
|
62
|
+
*/
|
|
63
|
+
export declare function getSweetlinkBridge(): SweetlinkBridge | null;
|
|
64
|
+
/**
|
|
65
|
+
* Destroy the global bridge instance
|
|
66
|
+
*/
|
|
67
|
+
export declare function destroySweetlinkBridge(): void;
|
|
68
|
+
export default SweetlinkBridge;
|
|
69
|
+
//# sourceMappingURL=SweetlinkBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SweetlinkBridge.d.ts","sourceRoot":"","sources":["../../src/browser/SweetlinkBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAc,UAAU,EAAuC,MAAM,aAAa,CAAC;AA4C/F,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,sBAAsB,CAA8C;IAC5E,OAAO,CAAC,kBAAkB,CAA8C;IAGxE,OAAO,CAAC,QAAQ,CAId;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAGxC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,eAAe,CAAyB;gBAEpC,MAAM,GAAE,qBAA0B;IA6C9C;;OAEG;IACH,IAAI,IAAI,IAAI;IAyBZ;;OAEG;IACH,OAAO,IAAI,IAAI;IA6Cf;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAQlC,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,gBAAgB;YAkIV,aAAa;CAyB5B;AAQD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,eAAe,CAQnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C;AAGD,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SweetlinkBridge - Vanilla JS WebSocket bridge for browser-side Sweetlink integration
|
|
3
|
+
*
|
|
4
|
+
* This module provides framework-agnostic browser integration for Sweetlink,
|
|
5
|
+
* eliminating the React dependency to avoid conflicts with host applications.
|
|
6
|
+
*
|
|
7
|
+
* @version 2.1.0
|
|
8
|
+
*/
|
|
9
|
+
// Import command handlers
|
|
10
|
+
import { handleExecJS, handleGetLogs, handleQueryDOM, handleRequestScreenshot, handleScreenshot, } from './commands/index.js';
|
|
11
|
+
import { createErrorHandler, createRejectionHandler, formatArgs, MAX_CONSOLE_LOGS, } from './consoleCapture.js';
|
|
12
|
+
// Import HMR utilities
|
|
13
|
+
import { captureHmrScreenshot, setupHmrDetection, } from './hmr.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Constants
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/** Port offset from app port to calculate WebSocket port */
|
|
18
|
+
const SWEETLINK_PORT_OFFSET = 6223;
|
|
19
|
+
const DEFAULT_WS_PORT = 9223;
|
|
20
|
+
const DEFAULT_MAX_PORT_RETRIES = 10;
|
|
21
|
+
/** HMR settings */
|
|
22
|
+
const DEFAULT_HMR_DEBOUNCE_MS = 300;
|
|
23
|
+
const DEFAULT_HMR_CAPTURE_DELAY_MS = 100;
|
|
24
|
+
/** Reconnection settings */
|
|
25
|
+
const RECONNECT_DELAY_MS = 2000;
|
|
26
|
+
const VERIFICATION_TIMEOUT_MS = 1000;
|
|
27
|
+
const PORT_RETRY_DELAY_MS = 100;
|
|
28
|
+
const PORT_SEARCH_FAIL_RETRY_MS = 3000;
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// SweetlinkBridge Class
|
|
31
|
+
// ============================================================================
|
|
32
|
+
export class SweetlinkBridge {
|
|
33
|
+
ws = null;
|
|
34
|
+
connected = false;
|
|
35
|
+
serverInfo = null;
|
|
36
|
+
verified = false;
|
|
37
|
+
consoleLogs = [];
|
|
38
|
+
reconnectTimeout = null;
|
|
39
|
+
savedScreenshotTimeout = null;
|
|
40
|
+
savedReviewTimeout = null;
|
|
41
|
+
// HMR tracking
|
|
42
|
+
hmrState = {
|
|
43
|
+
sequence: 0,
|
|
44
|
+
debounceTimeout: null,
|
|
45
|
+
lastCaptureTime: 0,
|
|
46
|
+
};
|
|
47
|
+
// Configuration
|
|
48
|
+
basePort;
|
|
49
|
+
maxPortRetries;
|
|
50
|
+
hmrScreenshots;
|
|
51
|
+
hmrConfig;
|
|
52
|
+
currentAppPort;
|
|
53
|
+
// Cleanup functions
|
|
54
|
+
cleanupFunctions = [];
|
|
55
|
+
originalConsole;
|
|
56
|
+
constructor(config = {}) {
|
|
57
|
+
// Skip on server-side
|
|
58
|
+
if (typeof window === 'undefined') {
|
|
59
|
+
this.basePort = DEFAULT_WS_PORT;
|
|
60
|
+
this.maxPortRetries = DEFAULT_MAX_PORT_RETRIES;
|
|
61
|
+
this.hmrScreenshots = false;
|
|
62
|
+
this.hmrConfig = {
|
|
63
|
+
debounceMs: DEFAULT_HMR_DEBOUNCE_MS,
|
|
64
|
+
captureDelay: DEFAULT_HMR_CAPTURE_DELAY_MS,
|
|
65
|
+
};
|
|
66
|
+
this.currentAppPort = 0;
|
|
67
|
+
this.originalConsole = {
|
|
68
|
+
log: console.log,
|
|
69
|
+
error: console.error,
|
|
70
|
+
warn: console.warn,
|
|
71
|
+
info: console.info,
|
|
72
|
+
};
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Calculate app port from URL
|
|
76
|
+
this.currentAppPort =
|
|
77
|
+
parseInt(window.location.port, 10) || (window.location.protocol === 'https:' ? 443 : 80);
|
|
78
|
+
// Calculate expected WS port (appPort + port offset)
|
|
79
|
+
this.basePort =
|
|
80
|
+
config.basePort ??
|
|
81
|
+
(this.currentAppPort > 0 ? this.currentAppPort + SWEETLINK_PORT_OFFSET : DEFAULT_WS_PORT);
|
|
82
|
+
this.maxPortRetries = config.maxPortRetries ?? DEFAULT_MAX_PORT_RETRIES;
|
|
83
|
+
this.hmrScreenshots = config.hmrScreenshots ?? false;
|
|
84
|
+
this.hmrConfig = {
|
|
85
|
+
debounceMs: config.hmrDebounceMs ?? DEFAULT_HMR_DEBOUNCE_MS,
|
|
86
|
+
captureDelay: config.hmrCaptureDelay ?? DEFAULT_HMR_CAPTURE_DELAY_MS,
|
|
87
|
+
};
|
|
88
|
+
// Store original console methods
|
|
89
|
+
this.originalConsole = {
|
|
90
|
+
log: console.log.bind(console),
|
|
91
|
+
error: console.error.bind(console),
|
|
92
|
+
warn: console.warn.bind(console),
|
|
93
|
+
info: console.info.bind(console),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Initialize the bridge - call this to start the connection
|
|
98
|
+
*/
|
|
99
|
+
init() {
|
|
100
|
+
if (typeof window === 'undefined')
|
|
101
|
+
return;
|
|
102
|
+
this.setupConsoleCapture();
|
|
103
|
+
this.setupErrorHandlers();
|
|
104
|
+
this.connectWebSocket(this.basePort);
|
|
105
|
+
if (this.hmrScreenshots) {
|
|
106
|
+
const cleanup = setupHmrDetection((trigger, changedFile, hmrMetadata) => {
|
|
107
|
+
if (this.verified) {
|
|
108
|
+
captureHmrScreenshot(this.ws, this.consoleLogs, this.hmrState, this.hmrConfig, trigger, changedFile, hmrMetadata);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
this.cleanupFunctions.push(cleanup);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Clean up and disconnect
|
|
116
|
+
*/
|
|
117
|
+
destroy() {
|
|
118
|
+
// Clear timeouts
|
|
119
|
+
if (this.reconnectTimeout)
|
|
120
|
+
clearTimeout(this.reconnectTimeout);
|
|
121
|
+
if (this.savedScreenshotTimeout)
|
|
122
|
+
clearTimeout(this.savedScreenshotTimeout);
|
|
123
|
+
if (this.savedReviewTimeout)
|
|
124
|
+
clearTimeout(this.savedReviewTimeout);
|
|
125
|
+
if (this.hmrState.debounceTimeout)
|
|
126
|
+
clearTimeout(this.hmrState.debounceTimeout);
|
|
127
|
+
// Null out timeout references to prevent stale references
|
|
128
|
+
this.reconnectTimeout = null;
|
|
129
|
+
this.savedScreenshotTimeout = null;
|
|
130
|
+
this.savedReviewTimeout = null;
|
|
131
|
+
// Reset HMR state to prevent memory leaks from closure references
|
|
132
|
+
this.hmrState = {
|
|
133
|
+
sequence: 0,
|
|
134
|
+
debounceTimeout: null,
|
|
135
|
+
lastCaptureTime: 0,
|
|
136
|
+
};
|
|
137
|
+
// Close WebSocket
|
|
138
|
+
if (this.ws) {
|
|
139
|
+
this.ws.close();
|
|
140
|
+
this.ws = null;
|
|
141
|
+
}
|
|
142
|
+
// Restore console
|
|
143
|
+
console.log = this.originalConsole.log;
|
|
144
|
+
console.error = this.originalConsole.error;
|
|
145
|
+
console.warn = this.originalConsole.warn;
|
|
146
|
+
console.info = this.originalConsole.info;
|
|
147
|
+
// Run cleanup functions
|
|
148
|
+
this.cleanupFunctions.forEach((fn) => fn());
|
|
149
|
+
this.cleanupFunctions = [];
|
|
150
|
+
// Clear console logs array to free memory
|
|
151
|
+
this.consoleLogs = [];
|
|
152
|
+
// Clear server info
|
|
153
|
+
this.serverInfo = null;
|
|
154
|
+
this.connected = false;
|
|
155
|
+
this.verified = false;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Check if connected to server
|
|
159
|
+
*/
|
|
160
|
+
isConnected() {
|
|
161
|
+
return this.connected && this.verified;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get server info
|
|
165
|
+
*/
|
|
166
|
+
getServerInfo() {
|
|
167
|
+
return this.serverInfo;
|
|
168
|
+
}
|
|
169
|
+
// ==========================================================================
|
|
170
|
+
// Private Methods
|
|
171
|
+
// ==========================================================================
|
|
172
|
+
setupConsoleCapture() {
|
|
173
|
+
const captureLog = (level, args) => {
|
|
174
|
+
this.consoleLogs.push({
|
|
175
|
+
level,
|
|
176
|
+
message: formatArgs(args),
|
|
177
|
+
timestamp: Date.now(),
|
|
178
|
+
});
|
|
179
|
+
// Keep only last N logs
|
|
180
|
+
if (this.consoleLogs.length > MAX_CONSOLE_LOGS) {
|
|
181
|
+
this.consoleLogs = this.consoleLogs.slice(-MAX_CONSOLE_LOGS);
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
// Patch all console methods with a unified wrapper
|
|
185
|
+
const levels = ['log', 'error', 'warn', 'info'];
|
|
186
|
+
for (const level of levels) {
|
|
187
|
+
const original = this.originalConsole[level];
|
|
188
|
+
console[level] = (...args) => {
|
|
189
|
+
captureLog(level, args);
|
|
190
|
+
original(...args);
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
setupErrorHandlers() {
|
|
195
|
+
const logsRef = { logs: this.consoleLogs };
|
|
196
|
+
const errorHandler = createErrorHandler(logsRef, MAX_CONSOLE_LOGS);
|
|
197
|
+
const rejectionHandler = createRejectionHandler(logsRef, MAX_CONSOLE_LOGS);
|
|
198
|
+
window.addEventListener('error', errorHandler);
|
|
199
|
+
window.addEventListener('unhandledrejection', rejectionHandler);
|
|
200
|
+
this.cleanupFunctions.push(() => {
|
|
201
|
+
window.removeEventListener('error', errorHandler);
|
|
202
|
+
window.removeEventListener('unhandledrejection', rejectionHandler);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
connectWebSocket(port) {
|
|
206
|
+
const wsUrl = `ws://localhost:${port}`;
|
|
207
|
+
const ws = new WebSocket(wsUrl);
|
|
208
|
+
this.ws = ws;
|
|
209
|
+
this.verified = false;
|
|
210
|
+
// Timeout for server-info response
|
|
211
|
+
const verificationTimeout = setTimeout(() => {
|
|
212
|
+
if (!this.verified && ws.readyState === WebSocket.OPEN) {
|
|
213
|
+
// Server didn't send server-info (old version) - accept for backwards compatibility
|
|
214
|
+
console.log(`[Sweetlink] Server on port ${port} is old version (no server-info). Accepting for backwards compatibility.`);
|
|
215
|
+
this.verified = true;
|
|
216
|
+
this.connected = true;
|
|
217
|
+
}
|
|
218
|
+
}, VERIFICATION_TIMEOUT_MS);
|
|
219
|
+
ws.onopen = () => {
|
|
220
|
+
console.log(`[Sweetlink] Connected to server on port ${port}`);
|
|
221
|
+
ws.send(JSON.stringify({ type: 'browser-client-ready' }));
|
|
222
|
+
};
|
|
223
|
+
ws.onmessage = async (event) => {
|
|
224
|
+
try {
|
|
225
|
+
const message = JSON.parse(event.data);
|
|
226
|
+
// Handle confirmation and info messages
|
|
227
|
+
switch (message.type) {
|
|
228
|
+
case 'screenshot-saved':
|
|
229
|
+
console.log('[Sweetlink] Screenshot saved:', message.path);
|
|
230
|
+
return;
|
|
231
|
+
case 'design-review-saved':
|
|
232
|
+
console.log('[Sweetlink] Design review saved:', message.reviewPath);
|
|
233
|
+
return;
|
|
234
|
+
case 'design-review-error':
|
|
235
|
+
console.error('[Sweetlink] Design review failed:', message.error);
|
|
236
|
+
return;
|
|
237
|
+
case 'server-info': {
|
|
238
|
+
clearTimeout(verificationTimeout);
|
|
239
|
+
const info = message;
|
|
240
|
+
console.log('[Sweetlink] Server info received:', info);
|
|
241
|
+
const serverMatchesApp = info.appPort === null || info.appPort === this.currentAppPort;
|
|
242
|
+
if (!serverMatchesApp) {
|
|
243
|
+
console.log(`[Sweetlink] Server is for port ${info.appPort}, but we're on port ${this.currentAppPort}. Trying next port...`);
|
|
244
|
+
ws.close();
|
|
245
|
+
const nextPort = port + 1;
|
|
246
|
+
if (nextPort < this.basePort + this.maxPortRetries) {
|
|
247
|
+
setTimeout(() => this.connectWebSocket(nextPort), PORT_RETRY_DELAY_MS);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
console.log(`[Sweetlink] No matching server found for port ${this.currentAppPort}. Will retry...`);
|
|
251
|
+
setTimeout(() => this.connectWebSocket(this.basePort), PORT_SEARCH_FAIL_RETRY_MS);
|
|
252
|
+
}
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
this.verified = true;
|
|
256
|
+
this.serverInfo = info;
|
|
257
|
+
this.connected = true;
|
|
258
|
+
console.log(`[Sweetlink] Verified connection to server for port ${info.appPort ?? 'any'} (project: ${info.projectDir})`);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (!this.verified) {
|
|
263
|
+
console.warn('[Sweetlink] Ignoring command before verification');
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const command = message;
|
|
267
|
+
console.log('[Sweetlink] Received command:', command.type);
|
|
268
|
+
const response = await this.handleCommand(command);
|
|
269
|
+
ws.send(JSON.stringify(response));
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
273
|
+
console.error('[Sweetlink] Error handling command:', errorMessage);
|
|
274
|
+
ws.send(JSON.stringify({
|
|
275
|
+
success: false,
|
|
276
|
+
error: errorMessage,
|
|
277
|
+
timestamp: Date.now(),
|
|
278
|
+
}));
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
ws.onclose = (event) => {
|
|
282
|
+
clearTimeout(verificationTimeout);
|
|
283
|
+
console.log('[Sweetlink] Disconnected from server');
|
|
284
|
+
this.connected = false;
|
|
285
|
+
this.serverInfo = null;
|
|
286
|
+
this.verified = false;
|
|
287
|
+
// If closed due to origin mismatch (code 4001), try next port immediately
|
|
288
|
+
if (event.code === 4001) {
|
|
289
|
+
const nextPort = port + 1;
|
|
290
|
+
if (nextPort < this.basePort + this.maxPortRetries) {
|
|
291
|
+
console.log(`[Sweetlink] Origin mismatch, trying port ${nextPort}...`);
|
|
292
|
+
setTimeout(() => this.connectWebSocket(nextPort), PORT_RETRY_DELAY_MS);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Try to reconnect
|
|
297
|
+
this.reconnectTimeout = setTimeout(() => {
|
|
298
|
+
console.log('[Sweetlink] Attempting to reconnect...');
|
|
299
|
+
this.connectWebSocket(this.basePort);
|
|
300
|
+
}, RECONNECT_DELAY_MS);
|
|
301
|
+
};
|
|
302
|
+
ws.onerror = (error) => {
|
|
303
|
+
clearTimeout(verificationTimeout);
|
|
304
|
+
console.error('[Sweetlink] WebSocket error:', error);
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
async handleCommand(command) {
|
|
308
|
+
switch (command.type) {
|
|
309
|
+
case 'screenshot':
|
|
310
|
+
return await handleScreenshot(command);
|
|
311
|
+
case 'request-screenshot':
|
|
312
|
+
return await handleRequestScreenshot(command, this.ws);
|
|
313
|
+
case 'query-dom':
|
|
314
|
+
return handleQueryDOM(command);
|
|
315
|
+
case 'get-logs':
|
|
316
|
+
return handleGetLogs(command, this.consoleLogs);
|
|
317
|
+
case 'exec-js':
|
|
318
|
+
return handleExecJS(command);
|
|
319
|
+
default:
|
|
320
|
+
return {
|
|
321
|
+
success: false,
|
|
322
|
+
error: `Unknown command: ${command.type}`,
|
|
323
|
+
timestamp: Date.now(),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// ============================================================================
|
|
329
|
+
// Auto-initialization function for script tag usage
|
|
330
|
+
// ============================================================================
|
|
331
|
+
let globalBridge = null;
|
|
332
|
+
/**
|
|
333
|
+
* Initialize Sweetlink Bridge - call from host application
|
|
334
|
+
*/
|
|
335
|
+
export function initSweetlinkBridge(config) {
|
|
336
|
+
if (globalBridge) {
|
|
337
|
+
return globalBridge;
|
|
338
|
+
}
|
|
339
|
+
globalBridge = new SweetlinkBridge(config);
|
|
340
|
+
globalBridge.init();
|
|
341
|
+
return globalBridge;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Get the global bridge instance
|
|
345
|
+
*/
|
|
346
|
+
export function getSweetlinkBridge() {
|
|
347
|
+
return globalBridge;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Destroy the global bridge instance
|
|
351
|
+
*/
|
|
352
|
+
export function destroySweetlinkBridge() {
|
|
353
|
+
if (globalBridge) {
|
|
354
|
+
globalBridge.destroy();
|
|
355
|
+
globalBridge = null;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Export default for backwards compatibility
|
|
359
|
+
export default SweetlinkBridge;
|
|
360
|
+
//# sourceMappingURL=SweetlinkBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SweetlinkBridge.js","sourceRoot":"","sources":["../../src/browser/SweetlinkBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles DOM query commands from the server.
|
|
5
|
+
*/
|
|
6
|
+
import type { SweetlinkCommand, SweetlinkResponse } from '../../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Handle query-dom command
|
|
9
|
+
*/
|
|
10
|
+
export declare function handleQueryDOM(command: SweetlinkCommand): SweetlinkResponse;
|
|
11
|
+
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../../src/browser/commands/dom.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE1E;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAyE3E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles DOM query commands from the server.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Handle query-dom command
|
|
8
|
+
*/
|
|
9
|
+
export function handleQueryDOM(command) {
|
|
10
|
+
try {
|
|
11
|
+
if (!command.selector) {
|
|
12
|
+
return {
|
|
13
|
+
success: false,
|
|
14
|
+
error: 'Selector is required',
|
|
15
|
+
timestamp: Date.now(),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const elements = document.querySelectorAll(command.selector);
|
|
19
|
+
if (elements.length === 0) {
|
|
20
|
+
return {
|
|
21
|
+
success: true,
|
|
22
|
+
data: {
|
|
23
|
+
found: false,
|
|
24
|
+
count: 0,
|
|
25
|
+
elements: [],
|
|
26
|
+
},
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const results = Array.from(elements).map((el, index) => {
|
|
31
|
+
const result = {
|
|
32
|
+
index,
|
|
33
|
+
tagName: el.tagName.toLowerCase(),
|
|
34
|
+
id: el.id || null,
|
|
35
|
+
className: el.className || null,
|
|
36
|
+
textContent: el.textContent?.slice(0, 200) || null,
|
|
37
|
+
};
|
|
38
|
+
if (command.property) {
|
|
39
|
+
const prop = command.property;
|
|
40
|
+
if (prop === 'computedStyle') {
|
|
41
|
+
const style = window.getComputedStyle(el);
|
|
42
|
+
result.computedStyle = {
|
|
43
|
+
display: style.display,
|
|
44
|
+
visibility: style.visibility,
|
|
45
|
+
opacity: style.opacity,
|
|
46
|
+
position: style.position,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
else if (prop === 'boundingRect') {
|
|
50
|
+
result.boundingRect = el.getBoundingClientRect();
|
|
51
|
+
}
|
|
52
|
+
else if (prop === 'attributes') {
|
|
53
|
+
result.attributes = Object.fromEntries(Array.from(el.attributes).map((attr) => [attr.name, attr.value]));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
result[prop] = el[prop];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
data: {
|
|
64
|
+
found: true,
|
|
65
|
+
count: elements.length,
|
|
66
|
+
elements: results,
|
|
67
|
+
},
|
|
68
|
+
timestamp: Date.now(),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
error: error instanceof Error ? error.message : 'Query failed',
|
|
75
|
+
timestamp: Date.now(),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../../src/browser/commands/dom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exec Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles JavaScript execution commands.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY WARNING: This module executes arbitrary JavaScript for debugging.
|
|
7
|
+
* It is restricted to localhost connections and development environments only.
|
|
8
|
+
*/
|
|
9
|
+
import type { SweetlinkCommand, SweetlinkResponse } from '../../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Handle exec-js command with security guards
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleExecJS(command: SweetlinkCommand): SweetlinkResponse;
|
|
14
|
+
//# sourceMappingURL=exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/browser/commands/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAQ1E;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAkCzE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exec Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles JavaScript execution commands.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY WARNING: This module executes arbitrary JavaScript for debugging.
|
|
7
|
+
* It is restricted to localhost connections and development environments only.
|
|
8
|
+
*/
|
|
9
|
+
const MAX_CODE_LENGTH = 10000;
|
|
10
|
+
function errorResponse(error) {
|
|
11
|
+
return { success: false, error, timestamp: Date.now() };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Handle exec-js command with security guards
|
|
15
|
+
*/
|
|
16
|
+
export function handleExecJS(command) {
|
|
17
|
+
// Security: Block in production environments
|
|
18
|
+
if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production') {
|
|
19
|
+
return errorResponse('exec-js is disabled in production for security reasons');
|
|
20
|
+
}
|
|
21
|
+
if (!command.code) {
|
|
22
|
+
return errorResponse('Code is required');
|
|
23
|
+
}
|
|
24
|
+
if (typeof command.code !== 'string') {
|
|
25
|
+
return errorResponse('Code must be a string');
|
|
26
|
+
}
|
|
27
|
+
if (command.code.length > MAX_CODE_LENGTH) {
|
|
28
|
+
return errorResponse(`Code exceeds maximum length of ${MAX_CODE_LENGTH} characters`);
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
// Execute the code - intentional for dev tools debugging
|
|
32
|
+
// eslint-disable-next-line no-eval
|
|
33
|
+
const result = (0, eval)(command.code);
|
|
34
|
+
return {
|
|
35
|
+
success: true,
|
|
36
|
+
data: {
|
|
37
|
+
result: typeof result === 'object' ? JSON.parse(JSON.stringify(result)) : result,
|
|
38
|
+
type: typeof result,
|
|
39
|
+
},
|
|
40
|
+
timestamp: Date.now(),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return errorResponse(error instanceof Error ? error.message : 'Execution failed');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/browser/commands/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,6CAA6C;IAC7C,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC7E,OAAO,aAAa,CAAC,wDAAwD,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,aAAa,CAAC,uBAAuB,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAC,kCAAkC,eAAe,aAAa,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,CAAC;QACH,yDAAyD;QACzD,mCAAmC;QACnC,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEvC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;gBAChF,IAAI,EAAE,OAAO,MAAM;aACpB;YACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACpF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all command handler functions.
|
|
5
|
+
*/
|
|
6
|
+
export { handleQueryDOM } from './dom.js';
|
|
7
|
+
export { handleExecJS } from './exec.js';
|
|
8
|
+
export { handleGetLogs } from './logs.js';
|
|
9
|
+
export { handleRequestScreenshot, handleScreenshot } from './screenshot.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/browser/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all command handler functions.
|
|
5
|
+
*/
|
|
6
|
+
export { handleQueryDOM } from './dom.js';
|
|
7
|
+
export { handleExecJS } from './exec.js';
|
|
8
|
+
export { handleGetLogs } from './logs.js';
|
|
9
|
+
export { handleRequestScreenshot, handleScreenshot } from './screenshot.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/browser/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|