@testmuai/playwright-bindings 0.1.2-beta.1 → 0.1.2-beta.2
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 +3 -3
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/configure.d.ts +5 -1
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +1 -0
- package/dist/configure.js.map +1 -1
- package/dist/helpers/assertion.d.ts.map +1 -1
- package/dist/helpers/assertion.js +9 -10
- package/dist/helpers/assertion.js.map +1 -1
- package/dist/helpers/executeApi.d.ts +12 -1
- package/dist/helpers/executeApi.d.ts.map +1 -1
- package/dist/helpers/executeApi.js +108 -20
- package/dist/helpers/executeApi.js.map +1 -1
- package/dist/helpers/kaneCli.d.ts +10 -1
- package/dist/helpers/kaneCli.d.ts.map +1 -1
- package/dist/helpers/kaneCli.js +122 -3
- package/dist/helpers/kaneCli.js.map +1 -1
- package/dist/helpers/math.d.ts +1 -1
- package/dist/helpers/math.d.ts.map +1 -1
- package/dist/helpers/math.js +6 -6
- package/dist/helpers/math.js.map +1 -1
- package/dist/helpers/network.d.ts +4 -4
- package/dist/helpers/network.d.ts.map +1 -1
- package/dist/helpers/network.js +16 -16
- package/dist/helpers/network.js.map +1 -1
- package/dist/helpers/smartui.d.ts +5 -1
- package/dist/helpers/smartui.d.ts.map +1 -1
- package/dist/helpers/smartui.js +45 -7
- package/dist/helpers/smartui.js.map +1 -1
- package/dist/helpers/vision.d.ts +50 -7
- package/dist/helpers/vision.d.ts.map +1 -1
- package/dist/helpers/vision.js +212 -29
- package/dist/helpers/vision.js.map +1 -1
- package/dist/helpers/wait.d.ts.map +1 -1
- package/dist/helpers/wait.js +1 -2
- package/dist/helpers/wait.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/relayProxy.d.ts +46 -0
- package/dist/relayProxy.d.ts.map +1 -0
- package/dist/relayProxy.js +453 -0
- package/dist/relayProxy.js.map +1 -0
- package/dist/session.d.ts +6 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +122 -12
- package/dist/session.js.map +1 -1
- package/dist/step.d.ts +1 -0
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +1 -0
- package/dist/step.js.map +1 -1
- package/dist/vars.d.ts +9 -20
- package/dist/vars.d.ts.map +1 -1
- package/dist/vars.js +23 -19
- package/dist/vars.js.map +1 -1
- package/package.json +9 -5
package/dist/helpers/wait.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/helpers/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/helpers/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAU,EAAE,SAAiB;IACrE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1B,GAAG,CAAC,MAAM,CAAC,4EAA4E,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,qCAAqC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,oBAAoB,EAAE;QAChF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;KACjE,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA0B,CAAC;IAC1D,OAAO,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC;AAChC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { configure } from './configure.js';
|
|
|
2
2
|
import { test } from './test.js';
|
|
3
3
|
import { step, done } from './step.js';
|
|
4
4
|
import { run } from './session.js';
|
|
5
|
-
import {
|
|
5
|
+
import { resolveVar, setVar } from './vars.js';
|
|
6
6
|
import { TestmuConfigError } from './errors.js';
|
|
7
7
|
import { executeJs } from './helpers/executeJs.js';
|
|
8
8
|
import { executeApi } from './helpers/executeApi.js';
|
|
@@ -42,7 +42,7 @@ declare const testmu: {
|
|
|
42
42
|
executeKaneCli: typeof executeKaneCli;
|
|
43
43
|
};
|
|
44
44
|
export default testmu;
|
|
45
|
-
export {
|
|
45
|
+
export { resolveVar, setVar, TestmuConfigError };
|
|
46
46
|
export type { ConfigureOptions, GlobalVariable } from './configure.js';
|
|
47
47
|
export type { RunTarget, Config } from './config.js';
|
|
48
48
|
export type { Reporter } from './reporters/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB,EAC1E,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;CASX,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtF,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { configure } from './configure.js';
|
|
|
2
2
|
import { test } from './test.js';
|
|
3
3
|
import { step, done } from './step.js';
|
|
4
4
|
import { run } from './session.js';
|
|
5
|
-
import {
|
|
5
|
+
import { resolveVar, setVar } from './vars.js';
|
|
6
6
|
import { TestmuConfigError } from './errors.js';
|
|
7
7
|
import { executeJs } from './helpers/executeJs.js';
|
|
8
8
|
import { executeApi } from './helpers/executeApi.js';
|
|
@@ -29,6 +29,6 @@ const testmu = {
|
|
|
29
29
|
checkUntilCondition, executeKaneCli,
|
|
30
30
|
};
|
|
31
31
|
export default testmu;
|
|
32
|
-
export {
|
|
32
|
+
export { resolveVar, setVar, TestmuConfigError };
|
|
33
33
|
export { ExecuteJsError } from './helpers/executeJs.js';
|
|
34
34
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB,GAC1E,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,gBAAgB,EAAE,CAAC;AAEnB,MAAM,MAAM,GAAG;IACb,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG;IAChC,SAAS,EAAE,UAAU,EAAE,SAAS;IAChC,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB;IACzE,eAAe,EAAE,cAAc;IAC/B,wBAAwB,EAAE,YAAY;IACtC,YAAY,EAAE,eAAe;IAC7B,SAAS,EAAE,SAAS;IACpB,mBAAmB,EAAE,cAAc;CACpC,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AAUjD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare class UpstreamConnectionError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class MessageBuffer {
|
|
5
|
+
private readonly maxSize;
|
|
6
|
+
private buffer;
|
|
7
|
+
constructor(maxSize?: number);
|
|
8
|
+
add(message: string | Buffer): void;
|
|
9
|
+
flush(): (string | Buffer)[];
|
|
10
|
+
get length(): number;
|
|
11
|
+
}
|
|
12
|
+
export declare class ObjectSnapshot {
|
|
13
|
+
private objects;
|
|
14
|
+
track(message: string | Buffer): void;
|
|
15
|
+
static isLifecycleMessage(message: string | Buffer): boolean;
|
|
16
|
+
replay(): string[];
|
|
17
|
+
}
|
|
18
|
+
export declare class PlaywrightRelayProxy {
|
|
19
|
+
private readonly upstreamUrl;
|
|
20
|
+
localPort: number;
|
|
21
|
+
private upstreamWs;
|
|
22
|
+
private clientWs;
|
|
23
|
+
private snapshot;
|
|
24
|
+
private buffer;
|
|
25
|
+
private ready;
|
|
26
|
+
private shutdownEv;
|
|
27
|
+
private server;
|
|
28
|
+
private drainTask;
|
|
29
|
+
private drainAbort;
|
|
30
|
+
private initialized;
|
|
31
|
+
private initResponse;
|
|
32
|
+
private serverMessages;
|
|
33
|
+
private clientConnected;
|
|
34
|
+
private clientDisconnected;
|
|
35
|
+
constructor(upstreamUrl: string, localPort?: number);
|
|
36
|
+
waitReady(): Promise<void>;
|
|
37
|
+
shutdown(): void;
|
|
38
|
+
start(): Promise<void>;
|
|
39
|
+
private trackServerMessage;
|
|
40
|
+
private drainUpstream;
|
|
41
|
+
private handleClient;
|
|
42
|
+
private handleFirstClient;
|
|
43
|
+
private handleReconnectingClient;
|
|
44
|
+
private relay;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=relayProxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayProxy.d.ts","sourceRoot":"","sources":["../src/relayProxy.ts"],"names":[],"mappings":"AAMA,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AA4FD,qBAAa,aAAa;IAEZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IADpC,OAAO,CAAC,MAAM,CAA2B;gBACZ,OAAO,SAAO;IAE3C,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKnC,KAAK,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE;IAM5B,IAAI,MAAM,IAAI,MAAM,CAA+B;CACpD;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA6B;IAE5C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWrC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAQ5D,MAAM,IAAI,MAAM,EAAE;CAGnB;AAID,qBAAa,oBAAoB;IAiB7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IACrB,SAAS,EAAE,MAAM;IAjB1B,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,kBAAkB,CAAiB;gBAGxB,WAAW,EAAE,MAAM,EAC7B,SAAS,GAAE,MAAU;IAK9B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1B,QAAQ,IAAI,IAAI;IAEV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD5B,OAAO,CAAC,kBAAkB;YAgBZ,aAAa;YA6Cb,YAAY;YA0CZ,iBAAiB;YAuCjB,wBAAwB;YAyBxB,KAAK;CAoCpB"}
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import WebSocket, { WebSocketServer } from 'ws';
|
|
2
|
+
import { log } from './log.js';
|
|
3
|
+
// ── Error type ──
|
|
4
|
+
export class UpstreamConnectionError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'UpstreamConnectionError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function createEvent() {
|
|
11
|
+
let resolve;
|
|
12
|
+
const promise = new Promise(r => { resolve = r; });
|
|
13
|
+
let fired = false;
|
|
14
|
+
return {
|
|
15
|
+
wait: () => promise,
|
|
16
|
+
set: () => { if (!fired) {
|
|
17
|
+
fired = true;
|
|
18
|
+
resolve();
|
|
19
|
+
} },
|
|
20
|
+
isSet: () => fired,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// Wraps a ws.WebSocket's 'message'/'close'/'error' events into an async recv() queue.
|
|
24
|
+
// PY analog: `await ws.recv()`.
|
|
25
|
+
class RecvQueue {
|
|
26
|
+
queue = [];
|
|
27
|
+
waiters = [];
|
|
28
|
+
closedErr = null;
|
|
29
|
+
ws;
|
|
30
|
+
onMessage;
|
|
31
|
+
onClose;
|
|
32
|
+
onError;
|
|
33
|
+
constructor(ws) {
|
|
34
|
+
this.ws = ws;
|
|
35
|
+
this.onMessage = (data, isBinary) => {
|
|
36
|
+
const msg = isBinary
|
|
37
|
+
? (Buffer.isBuffer(data) ? data : Buffer.from(data))
|
|
38
|
+
: data.toString();
|
|
39
|
+
this.push(msg);
|
|
40
|
+
};
|
|
41
|
+
this.onClose = () => this.close(new Error('ws closed'));
|
|
42
|
+
this.onError = (err) => this.close(err);
|
|
43
|
+
ws.on('message', this.onMessage);
|
|
44
|
+
ws.on('close', this.onClose);
|
|
45
|
+
ws.on('error', this.onError);
|
|
46
|
+
}
|
|
47
|
+
/** Detach listeners from the underlying WebSocket. Call when the queue is no longer needed. */
|
|
48
|
+
dispose() {
|
|
49
|
+
this.ws.off('message', this.onMessage);
|
|
50
|
+
this.ws.off('close', this.onClose);
|
|
51
|
+
this.ws.off('error', this.onError);
|
|
52
|
+
}
|
|
53
|
+
push(msg) {
|
|
54
|
+
const waiter = this.waiters.shift();
|
|
55
|
+
if (waiter)
|
|
56
|
+
waiter.resolve(msg);
|
|
57
|
+
else
|
|
58
|
+
this.queue.push(msg);
|
|
59
|
+
}
|
|
60
|
+
close(err) {
|
|
61
|
+
if (this.closedErr)
|
|
62
|
+
return;
|
|
63
|
+
this.closedErr = err;
|
|
64
|
+
for (const w of this.waiters)
|
|
65
|
+
w.reject(err);
|
|
66
|
+
this.waiters = [];
|
|
67
|
+
}
|
|
68
|
+
async recv() {
|
|
69
|
+
if (this.queue.length > 0)
|
|
70
|
+
return this.queue.shift();
|
|
71
|
+
if (this.closedErr)
|
|
72
|
+
throw this.closedErr;
|
|
73
|
+
return new Promise((resolve, reject) => { this.waiters.push({ resolve, reject }); });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function withTimeout(p, ms, label = 'timeout') {
|
|
77
|
+
let timer;
|
|
78
|
+
const timeout = new Promise((_, reject) => {
|
|
79
|
+
timer = setTimeout(() => reject(new Error(label)), ms);
|
|
80
|
+
});
|
|
81
|
+
try {
|
|
82
|
+
return await Promise.race([p, timeout]);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
if (timer)
|
|
86
|
+
clearTimeout(timer);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function sleep(ms) {
|
|
90
|
+
return new Promise(r => setTimeout(r, ms));
|
|
91
|
+
}
|
|
92
|
+
// ── MessageBuffer ──
|
|
93
|
+
export class MessageBuffer {
|
|
94
|
+
maxSize;
|
|
95
|
+
buffer = [];
|
|
96
|
+
constructor(maxSize = 1000) {
|
|
97
|
+
this.maxSize = maxSize;
|
|
98
|
+
}
|
|
99
|
+
add(message) {
|
|
100
|
+
if (this.buffer.length >= this.maxSize)
|
|
101
|
+
this.buffer.shift(); // drop oldest
|
|
102
|
+
this.buffer.push(message);
|
|
103
|
+
}
|
|
104
|
+
flush() {
|
|
105
|
+
const messages = this.buffer;
|
|
106
|
+
this.buffer = [];
|
|
107
|
+
return messages;
|
|
108
|
+
}
|
|
109
|
+
get length() { return this.buffer.length; }
|
|
110
|
+
}
|
|
111
|
+
// ── ObjectSnapshot ──
|
|
112
|
+
export class ObjectSnapshot {
|
|
113
|
+
objects = new Map();
|
|
114
|
+
track(message) {
|
|
115
|
+
if (typeof message !== 'string')
|
|
116
|
+
return;
|
|
117
|
+
let data;
|
|
118
|
+
try {
|
|
119
|
+
data = JSON.parse(message);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const method = data.method;
|
|
125
|
+
const guid = data.params?.guid;
|
|
126
|
+
if (!guid)
|
|
127
|
+
return;
|
|
128
|
+
if (method === '__create__')
|
|
129
|
+
this.objects.set(guid, message);
|
|
130
|
+
else if (method === '__dispose__')
|
|
131
|
+
this.objects.delete(guid);
|
|
132
|
+
}
|
|
133
|
+
static isLifecycleMessage(message) {
|
|
134
|
+
if (typeof message !== 'string')
|
|
135
|
+
return false;
|
|
136
|
+
try {
|
|
137
|
+
const data = JSON.parse(message);
|
|
138
|
+
return data.method === '__create__' || data.method === '__dispose__';
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
replay() {
|
|
145
|
+
return Array.from(this.objects.values());
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ── PlaywrightRelayProxy ──
|
|
149
|
+
export class PlaywrightRelayProxy {
|
|
150
|
+
upstreamUrl;
|
|
151
|
+
localPort;
|
|
152
|
+
upstreamWs = null;
|
|
153
|
+
clientWs = null;
|
|
154
|
+
snapshot = new ObjectSnapshot();
|
|
155
|
+
buffer = new MessageBuffer(1000);
|
|
156
|
+
ready = createEvent();
|
|
157
|
+
shutdownEv = createEvent();
|
|
158
|
+
server = null;
|
|
159
|
+
drainTask = null;
|
|
160
|
+
drainAbort = createEvent();
|
|
161
|
+
initialized = false;
|
|
162
|
+
initResponse = null;
|
|
163
|
+
serverMessages = [];
|
|
164
|
+
clientConnected = createEvent();
|
|
165
|
+
clientDisconnected = createEvent();
|
|
166
|
+
constructor(upstreamUrl, localPort = 0) {
|
|
167
|
+
this.upstreamUrl = upstreamUrl;
|
|
168
|
+
this.localPort = localPort;
|
|
169
|
+
this.clientDisconnected.set(); // start in "no client" state (PY parity)
|
|
170
|
+
}
|
|
171
|
+
waitReady() { return this.ready.wait(); }
|
|
172
|
+
shutdown() { this.shutdownEv.set(); }
|
|
173
|
+
async start() {
|
|
174
|
+
log.helper(`[RelayProxy] Connecting to upstream: ${this.upstreamUrl.slice(0, 80)}...`);
|
|
175
|
+
try {
|
|
176
|
+
this.upstreamWs = await withTimeout(new Promise((resolve, reject) => {
|
|
177
|
+
const ws = new WebSocket(this.upstreamUrl, { maxPayload: 0 });
|
|
178
|
+
ws.once('open', () => resolve(ws));
|
|
179
|
+
ws.once('error', reject);
|
|
180
|
+
// 4xx/5xx handshake responses — capture status, headers, body for diagnosis
|
|
181
|
+
ws.once('unexpected-response', (_req, res) => {
|
|
182
|
+
const chunks = [];
|
|
183
|
+
res.on('data', (c) => chunks.push(Buffer.isBuffer(c) ? c : Buffer.from(c)));
|
|
184
|
+
res.on('end', () => {
|
|
185
|
+
const body = Buffer.concat(chunks).toString('utf8').slice(0, 1000);
|
|
186
|
+
log.helper(`[RelayProxy] upstream handshake failed: status=${res.statusCode} ${res.statusMessage}`);
|
|
187
|
+
log.helper(`[RelayProxy] upstream response headers: ${JSON.stringify(res.headers)}`);
|
|
188
|
+
log.helper(`[RelayProxy] upstream response body (first 1000B): ${body}`);
|
|
189
|
+
reject(new Error(`HTTP ${res.statusCode} ${res.statusMessage}: ${body || '<empty body>'}`));
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}), 60_000, 'upstream connect timeout');
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
throw new UpstreamConnectionError(`Failed to connect to upstream ${this.upstreamUrl.slice(0, 120)}... : ${String(e)}`);
|
|
196
|
+
}
|
|
197
|
+
log.helper('[RelayProxy] Connected to upstream');
|
|
198
|
+
this.server = new WebSocketServer({ host: '127.0.0.1', port: this.localPort, maxPayload: 0 });
|
|
199
|
+
await new Promise(r => this.server.once('listening', r));
|
|
200
|
+
const addr = this.server.address();
|
|
201
|
+
this.localPort = addr.port;
|
|
202
|
+
this.server.on('connection', (ws) => { void this.handleClient(ws); });
|
|
203
|
+
log.helper(`[RelayProxy] Local server listening on ws://127.0.0.1:${this.localPort}`);
|
|
204
|
+
this.drainTask = this.drainUpstream();
|
|
205
|
+
this.ready.set();
|
|
206
|
+
await this.shutdownEv.wait();
|
|
207
|
+
// Clean shutdown
|
|
208
|
+
this.drainAbort.set();
|
|
209
|
+
try {
|
|
210
|
+
if (this.drainTask)
|
|
211
|
+
await withTimeout(this.drainTask, 1_000, 'drain exit timeout');
|
|
212
|
+
}
|
|
213
|
+
catch { /* ignore */ }
|
|
214
|
+
try {
|
|
215
|
+
this.upstreamWs?.close();
|
|
216
|
+
}
|
|
217
|
+
catch { /* ignore */ }
|
|
218
|
+
try {
|
|
219
|
+
this.clientWs?.close();
|
|
220
|
+
}
|
|
221
|
+
catch { /* ignore */ }
|
|
222
|
+
try {
|
|
223
|
+
this.server?.close();
|
|
224
|
+
}
|
|
225
|
+
catch { /* ignore */ }
|
|
226
|
+
log.helper('[RelayProxy] Proxy shut down.');
|
|
227
|
+
}
|
|
228
|
+
trackServerMessage(msg) {
|
|
229
|
+
this.snapshot.track(msg);
|
|
230
|
+
if (typeof msg === 'string') {
|
|
231
|
+
try {
|
|
232
|
+
const data = JSON.parse(msg);
|
|
233
|
+
// Skip pure response messages (have "id" but no "method"). PY parity.
|
|
234
|
+
if ('id' in data && !('method' in data))
|
|
235
|
+
return;
|
|
236
|
+
this.serverMessages.push(msg);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
this.serverMessages.push(msg);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
this.serverMessages.push(msg);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async drainUpstream() {
|
|
247
|
+
if (!this.upstreamWs)
|
|
248
|
+
return;
|
|
249
|
+
const recv = new RecvQueue(this.upstreamWs);
|
|
250
|
+
try {
|
|
251
|
+
while (!this.shutdownEv.isSet() && !this.drainAbort.isSet()) {
|
|
252
|
+
// Wait until "no client" (or 100ms tick, or abort)
|
|
253
|
+
if (!this.clientDisconnected.isSet()) {
|
|
254
|
+
const tick = await Promise.race([
|
|
255
|
+
this.clientDisconnected.wait().then(() => 'disconnected'),
|
|
256
|
+
sleep(100).then(() => 'tick'),
|
|
257
|
+
this.drainAbort.wait().then(() => 'abort'),
|
|
258
|
+
]);
|
|
259
|
+
if (tick === 'abort')
|
|
260
|
+
return;
|
|
261
|
+
if (tick === 'tick')
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
// If a client just connected, yield
|
|
265
|
+
if (this.clientConnected.isSet()) {
|
|
266
|
+
await sleep(0);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
// Race recv against abort + 500ms tick. If drainAbort fires, exit immediately
|
|
271
|
+
// WITHOUT processing any message — it goes to the next drain cycle instead.
|
|
272
|
+
const msg = await Promise.race([
|
|
273
|
+
recv.recv(),
|
|
274
|
+
sleep(500).then(() => { throw new Error('drain-recv-timeout'); }),
|
|
275
|
+
this.drainAbort.wait().then(() => { throw new Error('drain-aborted'); }),
|
|
276
|
+
]);
|
|
277
|
+
this.trackServerMessage(msg);
|
|
278
|
+
this.buffer.add(msg);
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
const s = String(e);
|
|
282
|
+
if (s.includes('drain-aborted'))
|
|
283
|
+
return;
|
|
284
|
+
if (s.includes('drain-recv-timeout'))
|
|
285
|
+
continue;
|
|
286
|
+
if (s.includes('ws closed')) {
|
|
287
|
+
log.helper('[RelayProxy] Upstream connection closed');
|
|
288
|
+
this.shutdownEv.set();
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
log.helper(`[RelayProxy] drainUpstream error: ${s}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
finally {
|
|
296
|
+
recv.dispose();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async handleClient(ws) {
|
|
300
|
+
if (this.clientWs && this.clientWs.readyState === WebSocket.OPEN) {
|
|
301
|
+
log.helper('[RelayProxy] Rejecting client: another client is already connected');
|
|
302
|
+
ws.close(1013, 'Another client is already connected');
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
// Claim slot synchronously so a concurrent second client is rejected by the gate above.
|
|
306
|
+
this.clientWs = ws;
|
|
307
|
+
this.clientConnected = createEvent();
|
|
308
|
+
this.clientConnected.set();
|
|
309
|
+
this.clientDisconnected = createEvent();
|
|
310
|
+
// Attach listener synchronously to avoid losing client messages sent during the
|
|
311
|
+
// drain-cancel await. `ws` emits 'message' immediately — unlike PY's `websockets`
|
|
312
|
+
// library, which buffers internally — so late listener = dropped messages.
|
|
313
|
+
const clientRecv = new RecvQueue(ws);
|
|
314
|
+
// PY parity: cancel drain before taking over upstream reads
|
|
315
|
+
this.drainAbort.set();
|
|
316
|
+
try {
|
|
317
|
+
if (this.drainTask)
|
|
318
|
+
await this.drainTask;
|
|
319
|
+
}
|
|
320
|
+
catch { /* ignore */ }
|
|
321
|
+
this.drainAbort = createEvent(); // reset for next cycle
|
|
322
|
+
log.helper('[RelayProxy] Client connected');
|
|
323
|
+
try {
|
|
324
|
+
if (!this.initialized)
|
|
325
|
+
await this.handleFirstClient(ws, clientRecv);
|
|
326
|
+
else
|
|
327
|
+
await this.handleReconnectingClient(ws, clientRecv);
|
|
328
|
+
}
|
|
329
|
+
catch (e) {
|
|
330
|
+
// ws closed is normal client disconnect — do not surface
|
|
331
|
+
log.helper(`[RelayProxy] client session ended: ${String(e)}`);
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
clientRecv.dispose();
|
|
335
|
+
this.clientWs = null;
|
|
336
|
+
this.clientConnected = createEvent();
|
|
337
|
+
this.clientDisconnected = createEvent();
|
|
338
|
+
this.clientDisconnected.set();
|
|
339
|
+
// PY parity: restart drain after client disconnects
|
|
340
|
+
if (!this.shutdownEv.isSet()) {
|
|
341
|
+
this.drainTask = this.drainUpstream();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async handleFirstClient(ws, clientRecv) {
|
|
346
|
+
log.helper('[RelayProxy] First client — transparent relay with init capture');
|
|
347
|
+
const upstreamRecv = new RecvQueue(this.upstreamWs);
|
|
348
|
+
try {
|
|
349
|
+
const initMsg = await clientRecv.recv();
|
|
350
|
+
if (typeof initMsg !== 'string')
|
|
351
|
+
throw new Error('expected string initialize');
|
|
352
|
+
const initData = JSON.parse(initMsg);
|
|
353
|
+
const initId = initData.id;
|
|
354
|
+
log.helper(`[RelayProxy] Relaying initialize (id=${initId})`);
|
|
355
|
+
this.upstreamWs.send(initMsg);
|
|
356
|
+
// Read upstream responses until the one matching initId arrives; forward each.
|
|
357
|
+
// eslint-disable-next-line no-constant-condition
|
|
358
|
+
while (true) {
|
|
359
|
+
const resp = await upstreamRecv.recv();
|
|
360
|
+
this.trackServerMessage(resp);
|
|
361
|
+
ws.send(resp);
|
|
362
|
+
if (typeof resp === 'string') {
|
|
363
|
+
try {
|
|
364
|
+
const d = JSON.parse(resp);
|
|
365
|
+
if (d.id === initId) {
|
|
366
|
+
const { id: _drop, ...rest } = d;
|
|
367
|
+
this.initResponse = rest;
|
|
368
|
+
this.initialized = true;
|
|
369
|
+
log.helper('[RelayProxy] Initialize handshake captured');
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
catch { /* ignore non-JSON */ }
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// Flush buffered messages to the client
|
|
377
|
+
for (const m of this.buffer.flush())
|
|
378
|
+
ws.send(m);
|
|
379
|
+
await this.relay(ws, clientRecv, upstreamRecv);
|
|
380
|
+
}
|
|
381
|
+
finally {
|
|
382
|
+
upstreamRecv.dispose();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
async handleReconnectingClient(ws, clientRecv) {
|
|
386
|
+
log.helper('[RelayProxy] Reconnecting client — intercepting initialize');
|
|
387
|
+
const upstreamRecv = new RecvQueue(this.upstreamWs);
|
|
388
|
+
try {
|
|
389
|
+
const initMsg = await clientRecv.recv();
|
|
390
|
+
if (typeof initMsg !== 'string')
|
|
391
|
+
throw new Error('expected string initialize');
|
|
392
|
+
const initId = JSON.parse(initMsg).id;
|
|
393
|
+
log.helper(`[RelayProxy] Intercepted initialize (id=${initId}), replaying cached state`);
|
|
394
|
+
// Replay every cached server→client message in original order
|
|
395
|
+
for (const m of this.serverMessages)
|
|
396
|
+
ws.send(m);
|
|
397
|
+
log.helper(`[RelayProxy] Replayed ${this.serverMessages.length} server messages`);
|
|
398
|
+
// Synthesize an initialize response with the client's id
|
|
399
|
+
ws.send(JSON.stringify({ id: initId, ...this.initResponse }));
|
|
400
|
+
log.helper('[RelayProxy] Sent synthesized initialize response');
|
|
401
|
+
// Flush any messages buffered while no client was connected
|
|
402
|
+
for (const m of this.buffer.flush())
|
|
403
|
+
ws.send(m);
|
|
404
|
+
await this.relay(ws, clientRecv, upstreamRecv);
|
|
405
|
+
}
|
|
406
|
+
finally {
|
|
407
|
+
upstreamRecv.dispose();
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
async relay(clientWs, clientRecv, upstreamRecv) {
|
|
411
|
+
const clientToUpstream = (async () => {
|
|
412
|
+
try {
|
|
413
|
+
// eslint-disable-next-line no-constant-condition
|
|
414
|
+
while (true) {
|
|
415
|
+
const m = await clientRecv.recv();
|
|
416
|
+
this.upstreamWs.send(m);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
catch (e) {
|
|
420
|
+
throw { side: 'client', err: e };
|
|
421
|
+
}
|
|
422
|
+
})();
|
|
423
|
+
const upstreamToClient = (async () => {
|
|
424
|
+
try {
|
|
425
|
+
// eslint-disable-next-line no-constant-condition
|
|
426
|
+
while (true) {
|
|
427
|
+
const m = await upstreamRecv.recv();
|
|
428
|
+
this.trackServerMessage(m);
|
|
429
|
+
clientWs.send(m);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
catch (e) {
|
|
433
|
+
throw { side: 'upstream', err: e };
|
|
434
|
+
}
|
|
435
|
+
})();
|
|
436
|
+
try {
|
|
437
|
+
await Promise.race([clientToUpstream, upstreamToClient]);
|
|
438
|
+
}
|
|
439
|
+
catch (tagged) {
|
|
440
|
+
const t = tagged;
|
|
441
|
+
if (t.side === 'upstream') {
|
|
442
|
+
log.helper(`[RelayProxy] Upstream connection lost during relay: ${String(t.err)}`);
|
|
443
|
+
this.shutdownEv.set();
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
// client-side close (clean or error): do NOT shut down the relay
|
|
447
|
+
// so kane-cli can cycle cleanly and test can reconnect.
|
|
448
|
+
log.helper(`[RelayProxy] Client disconnected (clean): ${String(t.err)}`);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
//# sourceMappingURL=relayProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayProxy.js","sourceRoot":"","sources":["../src/relayProxy.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
+
import { PlaywrightRelayProxy } from './relayProxy.js';
|
|
2
|
+
export declare const sessionState: {
|
|
3
|
+
relay: PlaywrightRelayProxy | null;
|
|
4
|
+
relayTask: Promise<void> | null;
|
|
5
|
+
relayUrl: string | null;
|
|
6
|
+
};
|
|
1
7
|
export declare function run(): Promise<void>;
|
|
2
8
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAQvD,eAAO,MAAM,YAAY,EAAE;IACzB,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC0B,CAAC;AA+DrD,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CA6EzC"}
|