@goliapkg/smix 1.0.9 → 1.0.11
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/dist/HttpRunner.d.ts +39 -0
- package/dist/HttpRunner.d.ts.map +1 -1
- package/dist/HttpRunner.js +59 -1
- package/dist/HttpRunner.js.map +1 -1
- package/dist/Session.d.ts +74 -0
- package/dist/Session.d.ts.map +1 -0
- package/dist/Session.js +169 -0
- package/dist/Session.js.map +1 -0
- package/dist/SimRuntime.js +6 -6
- package/dist/SimRuntime.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/HttpRunner.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ export type HttpFetch = (input: string, init: {
|
|
|
14
14
|
status: number;
|
|
15
15
|
json(): Promise<unknown>;
|
|
16
16
|
text(): Promise<string>;
|
|
17
|
+
/** v1.0.4 §D7 — optional; used to parse `X-Sim-Health` response header. */
|
|
18
|
+
headers?: {
|
|
19
|
+
get(name: string): string | null;
|
|
20
|
+
};
|
|
17
21
|
}>;
|
|
18
22
|
/**
|
|
19
23
|
* SmixSimRuntime + SelectorResolver wrapper around the smix-runner HTTP
|
|
@@ -30,7 +34,40 @@ export declare class HttpSimRuntime implements SmixSimRuntime {
|
|
|
30
34
|
* Pass directly to App constructor or Smix.launchApp.
|
|
31
35
|
*/
|
|
32
36
|
readonly labelsResolver: LabelsResolver;
|
|
37
|
+
/**
|
|
38
|
+
* v1.0.3 — session id sent as `Session-Id` header on every request
|
|
39
|
+
* when non-null. Set via {@link setSessionId}; when set, the runner
|
|
40
|
+
* short-circuits per-request `.activate()` and reuses the cached
|
|
41
|
+
* XCUIApplication binding. Typically managed by the {@link Session}
|
|
42
|
+
* class — direct callers rarely need to touch this.
|
|
43
|
+
*/
|
|
44
|
+
private sessionId;
|
|
45
|
+
/**
|
|
46
|
+
* v1.0.4 §D7 — setter installed by {@link Session.open} so this
|
|
47
|
+
* client can push `X-Sim-Health` header transitions back to the
|
|
48
|
+
* session's state machine. `null` when no session is open (legacy
|
|
49
|
+
* per-request path).
|
|
50
|
+
*/
|
|
51
|
+
private sessionStateSetter;
|
|
52
|
+
/**
|
|
53
|
+
* v1.0.3 — public alias for the wrapped fetch implementation.
|
|
54
|
+
* Consumed by the {@link Session} class which drives `/session/*`
|
|
55
|
+
* routes through the same transport.
|
|
56
|
+
*/
|
|
57
|
+
get fetch(): HttpFetch;
|
|
33
58
|
constructor(baseUrl: string, fetchImpl?: HttpFetch);
|
|
59
|
+
/**
|
|
60
|
+
* v1.0.3 — attach / clear the `Session-Id` header on every subsequent
|
|
61
|
+
* request. Called by {@link Session.open} / {@link Session.close};
|
|
62
|
+
* consumers who manage sessions manually can call this directly.
|
|
63
|
+
*/
|
|
64
|
+
setSessionId(id: string | null): void;
|
|
65
|
+
/**
|
|
66
|
+
* v1.0.4 §D7 — register a callback the client invokes on every
|
|
67
|
+
* response that carries `X-Sim-Health`. Session.open() wires this
|
|
68
|
+
* so consumers can subscribe via `session.on('state', ...)`.
|
|
69
|
+
*/
|
|
70
|
+
attachSessionState(setter: (state: SessionState) => void): void;
|
|
34
71
|
/**
|
|
35
72
|
* v7.7 c1 — direct match-count via dedicated FFI fn (avoid allocating
|
|
36
73
|
* the full ids list when callers only need count). Mirrors Rust
|
|
@@ -58,4 +95,6 @@ export declare class HttpSimRuntime implements SmixSimRuntime {
|
|
|
58
95
|
synthesizeTapAtNormalized(nx: number, ny: number): Promise<void>;
|
|
59
96
|
private post;
|
|
60
97
|
}
|
|
98
|
+
/** v1.0.4 §D7 — re-export from Session.ts so this file's use compiles. */
|
|
99
|
+
export type SessionState = 'healthy' | 'degraded' | 'cycling' | 'dead';
|
|
61
100
|
//# sourceMappingURL=HttpRunner.d.ts.map
|
package/dist/HttpRunner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpRunner.d.ts","sourceRoot":"","sources":["../src/HttpRunner.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EACV,OAAO,EAEP,cAAc,EACd,cAAc,EACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7E;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,KACpE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"HttpRunner.d.ts","sourceRoot":"","sources":["../src/HttpRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/HttpRunner.js
CHANGED
|
@@ -44,6 +44,29 @@ export class HttpSimRuntime {
|
|
|
44
44
|
* Pass directly to App constructor or Smix.launchApp.
|
|
45
45
|
*/
|
|
46
46
|
labelsResolver;
|
|
47
|
+
/**
|
|
48
|
+
* v1.0.3 — session id sent as `Session-Id` header on every request
|
|
49
|
+
* when non-null. Set via {@link setSessionId}; when set, the runner
|
|
50
|
+
* short-circuits per-request `.activate()` and reuses the cached
|
|
51
|
+
* XCUIApplication binding. Typically managed by the {@link Session}
|
|
52
|
+
* class — direct callers rarely need to touch this.
|
|
53
|
+
*/
|
|
54
|
+
sessionId = null;
|
|
55
|
+
/**
|
|
56
|
+
* v1.0.4 §D7 — setter installed by {@link Session.open} so this
|
|
57
|
+
* client can push `X-Sim-Health` header transitions back to the
|
|
58
|
+
* session's state machine. `null` when no session is open (legacy
|
|
59
|
+
* per-request path).
|
|
60
|
+
*/
|
|
61
|
+
sessionStateSetter = null;
|
|
62
|
+
/**
|
|
63
|
+
* v1.0.3 — public alias for the wrapped fetch implementation.
|
|
64
|
+
* Consumed by the {@link Session} class which drives `/session/*`
|
|
65
|
+
* routes through the same transport.
|
|
66
|
+
*/
|
|
67
|
+
get fetch() {
|
|
68
|
+
return this.fetchImpl;
|
|
69
|
+
}
|
|
47
70
|
constructor(baseUrl, fetchImpl = globalThis.fetch) {
|
|
48
71
|
this.baseUrl = baseUrl;
|
|
49
72
|
this.fetchImpl = fetchImpl;
|
|
@@ -56,6 +79,22 @@ export class HttpSimRuntime {
|
|
|
56
79
|
return r.labels;
|
|
57
80
|
};
|
|
58
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* v1.0.3 — attach / clear the `Session-Id` header on every subsequent
|
|
84
|
+
* request. Called by {@link Session.open} / {@link Session.close};
|
|
85
|
+
* consumers who manage sessions manually can call this directly.
|
|
86
|
+
*/
|
|
87
|
+
setSessionId(id) {
|
|
88
|
+
this.sessionId = id;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* v1.0.4 §D7 — register a callback the client invokes on every
|
|
92
|
+
* response that carries `X-Sim-Health`. Session.open() wires this
|
|
93
|
+
* so consumers can subscribe via `session.on('state', ...)`.
|
|
94
|
+
*/
|
|
95
|
+
attachSessionState(setter) {
|
|
96
|
+
this.sessionStateSetter = setter;
|
|
97
|
+
}
|
|
59
98
|
/**
|
|
60
99
|
* v7.7 c1 — direct match-count via dedicated FFI fn (avoid allocating
|
|
61
100
|
* the full ids list when callers only need count). Mirrors Rust
|
|
@@ -116,11 +155,30 @@ export class HttpSimRuntime {
|
|
|
116
155
|
}
|
|
117
156
|
async post(path, body) {
|
|
118
157
|
const url = `${this.baseUrl}${path}`;
|
|
158
|
+
const headers = {
|
|
159
|
+
'content-type': 'application/json',
|
|
160
|
+
};
|
|
161
|
+
if (this.sessionId !== null) {
|
|
162
|
+
headers['session-id'] = this.sessionId;
|
|
163
|
+
}
|
|
119
164
|
const resp = await this.fetchImpl(url, {
|
|
120
165
|
method: 'POST',
|
|
121
|
-
headers
|
|
166
|
+
headers,
|
|
122
167
|
body: JSON.stringify(body),
|
|
123
168
|
});
|
|
169
|
+
// v1.0.4 §D7 — parse X-Sim-Health header and forward to the
|
|
170
|
+
// attached session state setter (if any). Runs BEFORE the
|
|
171
|
+
// ok-check so state transitions are visible on error paths too.
|
|
172
|
+
const simHealthHeader = resp.headers?.get?.('x-sim-health');
|
|
173
|
+
if (simHealthHeader && this.sessionStateSetter) {
|
|
174
|
+
const normalized = simHealthHeader.trim().toLowerCase();
|
|
175
|
+
if (normalized === 'healthy' ||
|
|
176
|
+
normalized === 'degraded' ||
|
|
177
|
+
normalized === 'cycling' ||
|
|
178
|
+
normalized === 'dead') {
|
|
179
|
+
this.sessionStateSetter(normalized);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
124
182
|
if (!resp.ok) {
|
|
125
183
|
const text = await resp.text();
|
|
126
184
|
throw new Error(`smix-runner ${path} → HTTP ${resp.status}: ${text}`);
|
package/dist/HttpRunner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpRunner.js","sourceRoot":"","sources":["../src/HttpRunner.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,0EAA0E;AAC1E,mEAAmE;AACnE,sEAAsE;AACtE,kCAAkC;AAClC,EAAE;AACF,kDAAkD;AAClD,iFAAiF;AACjF,iFAAiF;AACjF,qFAAqF;AACrF,iFAAiF;AACjF,iGAAiG;AACjG,uGAAuG;AACvG,iFAAiF;AACjF,oGAAoG;AACpG,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,mGAAmG;AACnG,EAAE;AACF,qDAAqD;AACrD,gGAAgG;AAChG,sGAAsG;AACtG,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,uEAAuE;AACvE,yCAAyC;
|
|
1
|
+
{"version":3,"file":"HttpRunner.js","sourceRoot":"","sources":["../src/HttpRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { HttpFetch } from './HttpRunner.js';
|
|
2
|
+
interface HttpRunnerLike {
|
|
3
|
+
readonly baseUrl: string;
|
|
4
|
+
readonly fetch: HttpFetch;
|
|
5
|
+
setSessionId(id: string | null): void;
|
|
6
|
+
/** v1.0.4 §D7 — optional hook so the client can push state
|
|
7
|
+
* transitions parsed from `X-Sim-Health` headers back to the
|
|
8
|
+
* Session. Legacy runners omit the header; state stays `healthy`. */
|
|
9
|
+
attachSessionState?(setter: (state: SessionState) => void): void;
|
|
10
|
+
}
|
|
11
|
+
export interface SessionOpenOptions {
|
|
12
|
+
/** If true, runner calls `.activate()` on the target once at open time. */
|
|
13
|
+
activate?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* v1.0.4 §D7 — session-scoped sim health classification observed via
|
|
17
|
+
* the runner's `X-Sim-Health` response header. Consumers subscribe
|
|
18
|
+
* via {@link Session.on}.
|
|
19
|
+
*/
|
|
20
|
+
export type SessionState = 'healthy' | 'degraded' | 'cycling' | 'dead';
|
|
21
|
+
type StateListener = (state: SessionState) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Runner-side session guard. Use `Session.open()` to acquire, always
|
|
24
|
+
* pair with `session.close()` in a `finally` block.
|
|
25
|
+
*
|
|
26
|
+
* While the Session is open, every runner request from the same
|
|
27
|
+
* `HttpRunnerClient` carries a `Session-Id` header. The runner
|
|
28
|
+
* short-circuits per-request `.activate()` and reuses the session's
|
|
29
|
+
* cached binding.
|
|
30
|
+
*/
|
|
31
|
+
export declare class Session {
|
|
32
|
+
private readonly runner;
|
|
33
|
+
readonly sessionId: string;
|
|
34
|
+
readonly activatedOnce: boolean;
|
|
35
|
+
readonly serverTimeMs: number;
|
|
36
|
+
/** v1.0.4 §D7 — current classification; updated on every response
|
|
37
|
+
* that carries `X-Sim-Health`. */
|
|
38
|
+
private _state;
|
|
39
|
+
private readonly listeners;
|
|
40
|
+
private constructor();
|
|
41
|
+
static open(runner: HttpRunnerLike, bundleId: string, options?: SessionOpenOptions): Promise<Session>;
|
|
42
|
+
/** v1.0.4 §D7 — current sim-health classification. */
|
|
43
|
+
get state(): SessionState;
|
|
44
|
+
/** v1.0.4 §D7 — subscribe to state transitions. Returns an
|
|
45
|
+
* unsubscribe function. */
|
|
46
|
+
on(_event: 'state', listener: StateListener): () => void;
|
|
47
|
+
/** v1.0.5 §D1 — probe `/session/list` and return `true` iff this
|
|
48
|
+
* session's id is still known to the runner. Consumers wire this
|
|
49
|
+
* after a state transition to `cycling`/`dead` to decide whether
|
|
50
|
+
* to keep the session or reopen. */
|
|
51
|
+
stillValid(): Promise<boolean>;
|
|
52
|
+
/** v1.0.4 §D14 — instruct the runner to `terminate()` + `launch()`
|
|
53
|
+
* the session's cached `XCUIApplication` in place. Preserves the
|
|
54
|
+
* session id and XCUITest binding. Returns wall-clock ms. */
|
|
55
|
+
relaunchApp(): Promise<number>;
|
|
56
|
+
private updateState;
|
|
57
|
+
/**
|
|
58
|
+
* Ask the runner to re-issue `.activate()` on the session's cached
|
|
59
|
+
* binding. Subject to a runner-side 2 s rate limit per session; when
|
|
60
|
+
* rate-limited, returns `false` (no-op, session still healthy).
|
|
61
|
+
*
|
|
62
|
+
* Use when the client detects target-app drift (e.g. tree returned
|
|
63
|
+
* empty payload, foreground steal by system UI).
|
|
64
|
+
*/
|
|
65
|
+
renewActivation(): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Release the session. Sends `POST /session/close` (idempotent),
|
|
68
|
+
* clears the `Session-Id` header from the client. Subsequent client
|
|
69
|
+
* requests go via the legacy per-request rebind path (rate-limited).
|
|
70
|
+
*/
|
|
71
|
+
close(): Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=Session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../src/Session.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,UAAU,cAAc;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IACrC;;yEAEqE;IACrE,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAA;CACjE;AAED,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAA;AAEtE,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;AAElD;;;;;;;;GAQG;AACH,qBAAa,OAAO;IAOhB,OAAO,CAAC,QAAQ,CAAC,MAAM;aACP,SAAS,EAAE,MAAM;aACjB,aAAa,EAAE,OAAO;aACtB,YAAY,EAAE,MAAM;IATtC;sCACkC;IAClC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IAErD,OAAO;WAOM,IAAI,CACf,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,OAAO,CAAC;IAkCnB,sDAAsD;IACtD,IAAI,KAAK,IAAI,YAAY,CAExB;IAED;+BAC2B;IAC3B,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAKxD;;;wCAGoC;IAC9B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAgBpC;;iEAE6D;IACvD,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAmBpC,OAAO,CAAC,WAAW;IAYnB;;;;;;;OAOG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAmBzC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B"}
|
package/dist/Session.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// v1.0.3 — Session lifecycle wrapper.
|
|
2
|
+
//
|
|
3
|
+
// Session lifecycle addresses the runner-side "activation storm": pre-
|
|
4
|
+
// v1.0.2 runners called `.activate()` on every request whose
|
|
5
|
+
// `App-Activate: true` header was set, exhausting XCTest process
|
|
6
|
+
// arbitration on long-running gates. Sessions replace that with a
|
|
7
|
+
// one-shot lifecycle — open once, every subsequent request carries
|
|
8
|
+
// the `Session-Id` header, runner reuses its cached XCUIApplication
|
|
9
|
+
// binding, no per-request activation.
|
|
10
|
+
//
|
|
11
|
+
// Consumer flow:
|
|
12
|
+
//
|
|
13
|
+
// ```ts
|
|
14
|
+
// import { Smix, HttpRunnerClient, HttpSimRuntime, HttpSelectorResolver } from '@goliapkg/smix'
|
|
15
|
+
//
|
|
16
|
+
// const runner = new HttpRunnerClient('http://127.0.0.1:22087')
|
|
17
|
+
// const runtime = new HttpSimRuntime(runner)
|
|
18
|
+
// const resolver = new HttpSelectorResolver(runner)
|
|
19
|
+
// const session = await Session.open(runner, 'com.example.app', { activate: true })
|
|
20
|
+
// try {
|
|
21
|
+
// const app = await Smix.launchApp(bundleId('com.example.app'), runtime, resolver)
|
|
22
|
+
// // ... use `app` normally; every request carries Session-Id ...
|
|
23
|
+
// } finally {
|
|
24
|
+
// await session.close()
|
|
25
|
+
// }
|
|
26
|
+
// ```
|
|
27
|
+
/**
|
|
28
|
+
* Runner-side session guard. Use `Session.open()` to acquire, always
|
|
29
|
+
* pair with `session.close()` in a `finally` block.
|
|
30
|
+
*
|
|
31
|
+
* While the Session is open, every runner request from the same
|
|
32
|
+
* `HttpRunnerClient` carries a `Session-Id` header. The runner
|
|
33
|
+
* short-circuits per-request `.activate()` and reuses the session's
|
|
34
|
+
* cached binding.
|
|
35
|
+
*/
|
|
36
|
+
export class Session {
|
|
37
|
+
runner;
|
|
38
|
+
sessionId;
|
|
39
|
+
activatedOnce;
|
|
40
|
+
serverTimeMs;
|
|
41
|
+
/** v1.0.4 §D7 — current classification; updated on every response
|
|
42
|
+
* that carries `X-Sim-Health`. */
|
|
43
|
+
_state = 'healthy';
|
|
44
|
+
listeners = new Set();
|
|
45
|
+
constructor(runner, sessionId, activatedOnce, serverTimeMs) {
|
|
46
|
+
this.runner = runner;
|
|
47
|
+
this.sessionId = sessionId;
|
|
48
|
+
this.activatedOnce = activatedOnce;
|
|
49
|
+
this.serverTimeMs = serverTimeMs;
|
|
50
|
+
}
|
|
51
|
+
static async open(runner, bundleId, options = {}) {
|
|
52
|
+
const activate = options.activate ?? false;
|
|
53
|
+
const res = await runner.fetch(`${runner.baseUrl}/session/open`, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: { 'Content-Type': 'application/json' },
|
|
56
|
+
body: JSON.stringify({ bundleId, activate }),
|
|
57
|
+
});
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
const body = await res.text();
|
|
60
|
+
throw new Error(`Session.open ${bundleId}: HTTP ${res.status}: ${body}`);
|
|
61
|
+
}
|
|
62
|
+
const json = (await res.json());
|
|
63
|
+
if (typeof json.sessionId !== 'string' || json.sessionId.length === 0) {
|
|
64
|
+
throw new Error(`Session.open ${bundleId}: response missing sessionId`);
|
|
65
|
+
}
|
|
66
|
+
runner.setSessionId(json.sessionId);
|
|
67
|
+
const session = new Session(runner, json.sessionId, json.activatedOnce ?? false, json.serverTimeMs ?? 0);
|
|
68
|
+
// v1.0.4 §D7 — wire the runner's X-Sim-Health parse into this
|
|
69
|
+
// session's state machine. Legacy runner-clients without the
|
|
70
|
+
// attachSessionState hook keep working; the session's state stays
|
|
71
|
+
// 'healthy'.
|
|
72
|
+
runner.attachSessionState?.((next) => session.updateState(next));
|
|
73
|
+
return session;
|
|
74
|
+
}
|
|
75
|
+
/** v1.0.4 §D7 — current sim-health classification. */
|
|
76
|
+
get state() {
|
|
77
|
+
return this._state;
|
|
78
|
+
}
|
|
79
|
+
/** v1.0.4 §D7 — subscribe to state transitions. Returns an
|
|
80
|
+
* unsubscribe function. */
|
|
81
|
+
on(_event, listener) {
|
|
82
|
+
this.listeners.add(listener);
|
|
83
|
+
return () => this.listeners.delete(listener);
|
|
84
|
+
}
|
|
85
|
+
/** v1.0.5 §D1 — probe `/session/list` and return `true` iff this
|
|
86
|
+
* session's id is still known to the runner. Consumers wire this
|
|
87
|
+
* after a state transition to `cycling`/`dead` to decide whether
|
|
88
|
+
* to keep the session or reopen. */
|
|
89
|
+
async stillValid() {
|
|
90
|
+
const res = await this.runner.fetch(`${this.runner.baseUrl}/session/list`, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: { 'Content-Type': 'application/json' },
|
|
93
|
+
body: '{}',
|
|
94
|
+
});
|
|
95
|
+
if (!res.ok)
|
|
96
|
+
return false;
|
|
97
|
+
const json = (await res.json());
|
|
98
|
+
return (json.sessions ?? []).some((s) => s.sessionId === this.sessionId);
|
|
99
|
+
}
|
|
100
|
+
/** v1.0.4 §D14 — instruct the runner to `terminate()` + `launch()`
|
|
101
|
+
* the session's cached `XCUIApplication` in place. Preserves the
|
|
102
|
+
* session id and XCUITest binding. Returns wall-clock ms. */
|
|
103
|
+
async relaunchApp() {
|
|
104
|
+
const res = await this.runner.fetch(`${this.runner.baseUrl}/session/relaunch-app`, {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
headers: { 'Content-Type': 'application/json' },
|
|
107
|
+
body: JSON.stringify({ sessionId: this.sessionId }),
|
|
108
|
+
});
|
|
109
|
+
if (!res.ok) {
|
|
110
|
+
const body = await res.text();
|
|
111
|
+
throw new Error(`Session.relaunchApp ${this.sessionId}: HTTP ${res.status}: ${body}`);
|
|
112
|
+
}
|
|
113
|
+
const json = (await res.json());
|
|
114
|
+
return json.wallMs ?? 0;
|
|
115
|
+
}
|
|
116
|
+
updateState(next) {
|
|
117
|
+
if (next === this._state)
|
|
118
|
+
return;
|
|
119
|
+
this._state = next;
|
|
120
|
+
for (const listener of this.listeners) {
|
|
121
|
+
try {
|
|
122
|
+
listener(next);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Consumer callbacks must not break the runner-response path.
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Ask the runner to re-issue `.activate()` on the session's cached
|
|
131
|
+
* binding. Subject to a runner-side 2 s rate limit per session; when
|
|
132
|
+
* rate-limited, returns `false` (no-op, session still healthy).
|
|
133
|
+
*
|
|
134
|
+
* Use when the client detects target-app drift (e.g. tree returned
|
|
135
|
+
* empty payload, foreground steal by system UI).
|
|
136
|
+
*/
|
|
137
|
+
async renewActivation() {
|
|
138
|
+
const res = await this.runner.fetch(`${this.runner.baseUrl}/session/renew-activation`, {
|
|
139
|
+
method: 'POST',
|
|
140
|
+
headers: { 'Content-Type': 'application/json' },
|
|
141
|
+
body: JSON.stringify({ sessionId: this.sessionId }),
|
|
142
|
+
});
|
|
143
|
+
if (!res.ok) {
|
|
144
|
+
const body = await res.text();
|
|
145
|
+
throw new Error(`Session.renewActivation ${this.sessionId}: HTTP ${res.status}: ${body}`);
|
|
146
|
+
}
|
|
147
|
+
const json = (await res.json());
|
|
148
|
+
return json.activated ?? false;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Release the session. Sends `POST /session/close` (idempotent),
|
|
152
|
+
* clears the `Session-Id` header from the client. Subsequent client
|
|
153
|
+
* requests go via the legacy per-request rebind path (rate-limited).
|
|
154
|
+
*/
|
|
155
|
+
async close() {
|
|
156
|
+
try {
|
|
157
|
+
await this.runner.fetch(`${this.runner.baseUrl}/session/close`, {
|
|
158
|
+
method: 'POST',
|
|
159
|
+
headers: { 'Content-Type': 'application/json' },
|
|
160
|
+
body: JSON.stringify({ sessionId: this.sessionId }),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
// Clear the client header regardless of runner-side outcome.
|
|
165
|
+
this.runner.setSessionId(null);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=Session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Session.js","sourceRoot":"","sources":["../src/Session.ts"],"names":[],"mappings":"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"}
|
package/dist/SimRuntime.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
//
|
|
1
|
+
// SmixSimRuntime interface + MockSimRuntime impl.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// - HttpSimRuntime (real, lives in src/HttpRunner.ts
|
|
6
|
-
//
|
|
3
|
+
// Mirrors the Swift and Kotlin SimRuntime architecture. The TS SDK is
|
|
4
|
+
// HTTP-runner-friendly:
|
|
5
|
+
// - HttpSimRuntime (real, lives in src/HttpRunner.ts): wraps the
|
|
6
|
+
// smix-runner HTTP server via fetch (cross-platform iOS+Android).
|
|
7
7
|
// - MockSimRuntime (here): in-memory tree + event log for unit tests.
|
|
8
8
|
//
|
|
9
|
-
//
|
|
9
|
+
// This module is intended for test targets only.
|
|
10
10
|
const EMPTY_DEFAULT = {
|
|
11
11
|
rawType: 'other',
|
|
12
12
|
bounds: { x: 0, y: 0, w: 393, h: 852 },
|
package/dist/SimRuntime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimRuntime.js","sourceRoot":"","sources":["../src/SimRuntime.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"SimRuntime.js","sourceRoot":"","sources":["../src/SimRuntime.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ export { MockSimRuntime, type KeyName, type LaunchFreshCall, type SmixSimRuntime
|
|
|
8
8
|
export { MockLabelsResolver, MockSelectorResolver, type LabelsResolver, type SelectorResolver, } from './SelectorResolver.js';
|
|
9
9
|
export { HttpSimRuntime, type HttpFetch, } from './HttpRunner.js';
|
|
10
10
|
export { findById, flatten, rectCenter, type A11yNode, type A11yRole, type Rect, } from './A11yNode.js';
|
|
11
|
+
export { Session, type SessionOpenOptions, } from './Session.js';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,GAAG,GACJ,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,OAAO,EACP,eAAe,EACf,aAAa,EACb,KAAK,EACL,KAAK,OAAO,GACb,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,OAAO,EACP,uBAAuB,GACxB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,KAAK,SAAS,GACf,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,cAAc,EACd,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,KAAK,SAAS,GACf,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,IAAI,GACV,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,GAAG,GACJ,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,OAAO,EACP,eAAe,EACf,aAAa,EACb,KAAK,EACL,KAAK,OAAO,GACb,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,OAAO,EACP,uBAAuB,GACxB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,KAAK,SAAS,GACf,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,cAAc,EACd,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,KAAK,SAAS,GACf,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,IAAI,GACV,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,OAAO,EACP,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
//
|
|
1
|
+
// @goliapkg/smix public API exports.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// Mirrors Kotlin SDK + Swift SDK surface. This package is intended for
|
|
4
|
+
// test harnesses (vitest / jest / Detox-like runners) — it should not be
|
|
5
|
+
// bundled into a production RN app.
|
|
6
6
|
export { App, } from './App.js';
|
|
7
7
|
export { literal, patternFromJson, patternToJson, regex, } from './Pattern.js';
|
|
8
8
|
export { encodeSelectorJson, Selector, selectorFromJsonValue, selectorToJsonValue, } from './Selector.js';
|
|
@@ -13,4 +13,6 @@ export { MockSimRuntime, } from './SimRuntime.js';
|
|
|
13
13
|
export { MockLabelsResolver, MockSelectorResolver, } from './SelectorResolver.js';
|
|
14
14
|
export { HttpSimRuntime, } from './HttpRunner.js';
|
|
15
15
|
export { findById, flatten, rectCenter, } from './A11yNode.js';
|
|
16
|
+
// v1.0.3 — session lifecycle. Wraps runner-side `/session/*` routes.
|
|
17
|
+
export { Session, } from './Session.js';
|
|
16
18
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,oCAAoC;AAEpC,OAAO,EACL,GAAG,GACJ,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,OAAO,EACP,eAAe,EACf,aAAa,EACb,KAAK,GAEN,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,GAMpB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,kBAAkB,EAClB,aAAa,GAEd,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,OAAO,EACP,uBAAuB,GACxB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,OAAO,EACP,QAAQ,EACR,IAAI,GAEL,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,cAAc,GAKf,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,GAEf,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,QAAQ,EACR,OAAO,EACP,UAAU,GAIX,MAAM,eAAe,CAAA;AAEtB,qEAAqE;AACrE,OAAO,EACL,OAAO,GAER,MAAM,cAAc,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goliapkg/smix",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.11",
|
|
4
4
|
"description": "Playwright-shape iOS Simulator / Android emulator UI automation SDK for React Native + Expo + Detox-compatible TypeScript test runners.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0 OR MIT",
|