@qontinui/ui-bridge-native 0.6.9 → 0.6.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/control/action-executor.d.ts.map +1 -1
- package/dist/control/index.js +2 -1
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +2 -1
- package/dist/control/index.mjs.map +1 -1
- package/dist/core/index.js +232 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +232 -2
- package/dist/core/index.mjs.map +1 -1
- package/dist/core/registry.d.ts +46 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/types.d.ts +114 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/vision-fields.d.ts +142 -0
- package/dist/core/vision-fields.d.ts.map +1 -0
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +371 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +365 -22
- package/dist/index.mjs.map +1 -1
- package/dist/react/UIBridgeNativeProvider.d.ts.map +1 -1
- package/dist/react/index.js +323 -20
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +324 -21
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/useUIElement.d.ts.map +1 -1
- package/dist/server/bind-retry.d.ts +64 -0
- package/dist/server/bind-retry.d.ts.map +1 -0
- package/dist/server/handlers.d.ts.map +1 -1
- package/dist/server/http-server.d.ts +9 -1
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +275 -13
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +274 -14
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/observability.d.ts +4 -3
- package/dist/server/observability.d.ts.map +1 -1
- package/dist/server/types.d.ts +10 -0
- package/dist/server/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUIElement.d.ts","sourceRoot":"","sources":["../../src/react/useUIElement.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AA4DvB,KAAK,UAAU,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAE1C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,MAAM,6BAA6B,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB;IACtF,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACnD;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACpD,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mCAAmC,CAClD,CAAC,SAAS,6BAA6B,GAAG,6BAA6B,CACvE,SAAQ,uBAAuB,CAAC,CAAC,CAAC;IAClC;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE;QACR,oEAAoE;QACpE,OAAO,EAAE,YAAY,CAAC;QACtB,6DAA6D;QAC7D,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;KACvC,CAAC;CACH;AAED;;;;GAIG;AACH,MAAM,WAAW,mCAAmC,CAClD,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CAC/C,SAAQ,uBAAuB,CAAC,CAAC,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;CACnD;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,IAC7E,CAAC,SAAS,6BAA6B,GACnC,mCAAmC,CAAC,CAAC,CAAC,GACtC,mCAAmC,CAAC,CAAC,CAAC,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACvC,mGAAmG;IACnG,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,WAAW,EAAE;YAAE,MAAM,EAAE;gBAAE,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;KAClF,KAAK,IAAI,CAAC;IACX,0DAA0D;IAC1D,WAAW,EAAE,aAAa,CAAC;IAC3B,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;IACpB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,kBAAkB,GAAG,IAAI,CAAC;IAC1C,6BAA6B;IAC7B,aAAa,EAAE,MAAM,uBAAuB,GAAG,IAAI,CAAC;IACpD,wCAAwC;IACxC,OAAO,EAAE,CACP,MAAM,EAAE,oBAAoB,GAAG,MAAM,EACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,sCAAsC;IACtC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,kCAAkC;IAClC,iBAAiB,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAClD,uEAAuE;IACvE,WAAW,EAAE,CACX,KAAK,EAAE,OAAO,EACd,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KACvE,IAAI,CAAC;IACV;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAoFD,wBAAgB,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,EAC1E,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"useUIElement.d.ts","sourceRoot":"","sources":["../../src/react/useUIElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilient TCP-bind helper for native UI Bridge server adapters.
|
|
3
|
+
*
|
|
4
|
+
* Background: the on-device bridge binds a TCP server on a fixed port (8087).
|
|
5
|
+
* On hot-reload, app foreground/background cycles, or a crash-restart, the OS
|
|
6
|
+
* can leave the previous socket in a lingering state, so the fresh bind fails
|
|
7
|
+
* with `EADDRINUSE`. The original adapter gave up after 3 fixed retries
|
|
8
|
+
* (~5s total), after which the bridge was permanently dead until the app was
|
|
9
|
+
* fully restarted — a single transient stale socket bricked automation.
|
|
10
|
+
*
|
|
11
|
+
* This helper centralises a robust bind loop so every adapter (and a unit
|
|
12
|
+
* test) shares one implementation:
|
|
13
|
+
* - SO_REUSEADDR is requested on bind where the platform/library supports it
|
|
14
|
+
* (passed through to the caller's `attempt` via `reuseAddress: true`), so
|
|
15
|
+
* a lingering TIME_WAIT socket doesn't block rebind.
|
|
16
|
+
* - On `EADDRINUSE` it retries with exponential backoff (capped) for at
|
|
17
|
+
* least `minTotalMs` (default 30s) instead of bailing after a fixed count.
|
|
18
|
+
* - Every retry is logged so operators can see the bridge recovering.
|
|
19
|
+
* - Non-`EADDRINUSE` errors fail fast (a wrong-permission / bad-host error
|
|
20
|
+
* won't fix itself by waiting).
|
|
21
|
+
*
|
|
22
|
+
* The helper is transport-agnostic: the caller supplies an `attempt` thunk
|
|
23
|
+
* that performs ONE bind attempt and resolves on `listening` / rejects on
|
|
24
|
+
* error. This keeps the package free of any concrete TCP library dependency
|
|
25
|
+
* (the same reason `ServerAdapter` is an interface).
|
|
26
|
+
*/
|
|
27
|
+
/** True when an error looks like an address-already-in-use bind failure. */
|
|
28
|
+
export declare function isAddrInUseError(err: unknown): boolean;
|
|
29
|
+
export interface BindWithRetryOptions {
|
|
30
|
+
/**
|
|
31
|
+
* Minimum total wall-clock time to keep retrying `EADDRINUSE` before giving
|
|
32
|
+
* up, in milliseconds. The loop always makes at least one attempt and keeps
|
|
33
|
+
* retrying until this budget is exhausted. Default 30_000 (30s).
|
|
34
|
+
*
|
|
35
|
+
* Pass `Infinity` to retry indefinitely (with capped backoff) — appropriate
|
|
36
|
+
* for an always-on device bridge that should self-heal whenever the stale
|
|
37
|
+
* socket finally clears.
|
|
38
|
+
*/
|
|
39
|
+
minTotalMs?: number;
|
|
40
|
+
/** Initial backoff delay between retries, in ms. Default 500. */
|
|
41
|
+
initialDelayMs?: number;
|
|
42
|
+
/** Maximum backoff delay (cap for exponential growth), in ms. Default 5_000. */
|
|
43
|
+
maxDelayMs?: number;
|
|
44
|
+
/** Multiplier applied to the delay after each retry. Default 2. */
|
|
45
|
+
backoffFactor?: number;
|
|
46
|
+
/** Logger for retry diagnostics. Defaults to `console`. */
|
|
47
|
+
logger?: Pick<Console, 'warn' | 'error'>;
|
|
48
|
+
/** Injectable sleep — overridable in tests to avoid real timers. */
|
|
49
|
+
sleep?: (ms: number) => Promise<void>;
|
|
50
|
+
/** Injectable clock — overridable in tests. Defaults to `Date.now`. */
|
|
51
|
+
now?: () => number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Run `attempt()` repeatedly until it resolves, retrying on `EADDRINUSE` with
|
|
55
|
+
* exponential backoff for at least `minTotalMs`. Non-address-in-use errors
|
|
56
|
+
* reject immediately. Resolves once a bind attempt succeeds.
|
|
57
|
+
*
|
|
58
|
+
* @param attempt One bind attempt. Receives the attempt index (0-based) and
|
|
59
|
+
* MUST resolve on a successful `listening` event or reject on error. The
|
|
60
|
+
* caller is responsible for tearing down any half-bound server before the
|
|
61
|
+
* next attempt (see the adapter's `recreate` thunk).
|
|
62
|
+
*/
|
|
63
|
+
export declare function bindWithRetry(attempt: (attemptIndex: number) => Promise<void>, options?: BindWithRetryOptions): Promise<void>;
|
|
64
|
+
//# sourceMappingURL=bind-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind-retry.d.ts","sourceRoot":"","sources":["../../src/server/bind-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAWtD;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACzC,oEAAoE;IACpE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAKD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAChD,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAwCf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/server/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/server/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EACL,KAAK,sBAAsB,EAI5B,MAAM,kBAAkB,CAAC;AAS1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAQV,oBAAoB,EAKrB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AA4VhF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,CAAC,EAAE;IACP,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iFAAiF;IACjF,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D,GACA,oBAAoB,CAs+BtB"}
|
|
@@ -90,10 +90,18 @@ export declare class NativeUIBridgeServer {
|
|
|
90
90
|
* Observability ring buffers backing `/control/console-errors` and
|
|
91
91
|
* `/sdk/network-requests`. Allocated unconditionally so the handler can
|
|
92
92
|
* always read them, but the global patches (`install()`) only fire on
|
|
93
|
-
* `start()` when
|
|
93
|
+
* `start()` when observability is enabled (the dedicated `observability`
|
|
94
|
+
* flag, defaulting to `testHooks`) — builds with both off don't
|
|
95
|
+
* monkey-patch.
|
|
94
96
|
*/
|
|
95
97
|
private consoleErrorBuffer;
|
|
96
98
|
private networkRequestBuffer;
|
|
99
|
+
/**
|
|
100
|
+
* Whether the console/network capture should be installed. The dedicated
|
|
101
|
+
* `observability` flag wins when set; otherwise falls back to `testHooks`
|
|
102
|
+
* so consumers predating the flag keep their exact behavior.
|
|
103
|
+
*/
|
|
104
|
+
private observabilityEnabled;
|
|
97
105
|
constructor(registry: NativeUIBridgeRegistry, executor: NativeActionExecutor, config?: NativeServerConfig);
|
|
98
106
|
/**
|
|
99
107
|
* Set the server adapter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,kBAAkB,CAAC;AACrF,OAAO,KAAK,EACV,kBAAkB,EAElB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,SAAS,CAAC;AAIjB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAkXlE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAE7E;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iCAAiC;IACjC,SAAS,IAAI,OAAO,CAAC;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,mGAAmG;IACnG,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjF,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,kDAAkD;IAClD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED;;GAEG;AACH,qBAAa,oBAAoB;
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -13,4 +13,6 @@ export { WebSocketConnection } from './ws-connection';
|
|
|
13
13
|
export type { WebSocketMessageHandler } from './ws-connection';
|
|
14
14
|
export { WebSocketEventBridge } from './ws-event-bridge';
|
|
15
15
|
export { ConsoleErrorBuffer, NetworkRequestBuffer } from './observability';
|
|
16
|
+
export { bindWithRetry, isAddrInUseError } from './bind-retry';
|
|
17
|
+
export type { BindWithRetryOptions } from './bind-retry';
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -209,6 +209,179 @@ var UI_BRIDGE_NATIVE_ROUTES = {
|
|
|
209
209
|
}
|
|
210
210
|
};
|
|
211
211
|
|
|
212
|
+
// src/core/vision-fields.ts
|
|
213
|
+
var INTERACTIVE_HANDLER_NAMES = /* @__PURE__ */ new Set([
|
|
214
|
+
"onPress",
|
|
215
|
+
"onPressIn",
|
|
216
|
+
"onPressOut",
|
|
217
|
+
"onLongPress",
|
|
218
|
+
"onChangeText",
|
|
219
|
+
"onValueChange",
|
|
220
|
+
"onChange",
|
|
221
|
+
"onSubmitEditing",
|
|
222
|
+
"onClick",
|
|
223
|
+
"onTouchStart",
|
|
224
|
+
"onTouchEnd"
|
|
225
|
+
]);
|
|
226
|
+
var INTERACTIVE_TYPES = /* @__PURE__ */ new Set([
|
|
227
|
+
"button",
|
|
228
|
+
"input",
|
|
229
|
+
"switch",
|
|
230
|
+
"checkbox",
|
|
231
|
+
"radio",
|
|
232
|
+
"touchable",
|
|
233
|
+
"pressable",
|
|
234
|
+
"listItem"
|
|
235
|
+
]);
|
|
236
|
+
function roleForType(type) {
|
|
237
|
+
switch (type) {
|
|
238
|
+
case "button":
|
|
239
|
+
case "touchable":
|
|
240
|
+
case "pressable":
|
|
241
|
+
return "button";
|
|
242
|
+
case "input":
|
|
243
|
+
return "textbox";
|
|
244
|
+
case "text":
|
|
245
|
+
return "text";
|
|
246
|
+
case "switch":
|
|
247
|
+
return "switch";
|
|
248
|
+
case "checkbox":
|
|
249
|
+
return "checkbox";
|
|
250
|
+
case "radio":
|
|
251
|
+
return "radio";
|
|
252
|
+
case "image":
|
|
253
|
+
return "img";
|
|
254
|
+
case "list":
|
|
255
|
+
return "list";
|
|
256
|
+
case "listItem":
|
|
257
|
+
return "listitem";
|
|
258
|
+
case "modal":
|
|
259
|
+
return "dialog";
|
|
260
|
+
case "scroll":
|
|
261
|
+
case "view":
|
|
262
|
+
case "custom":
|
|
263
|
+
default:
|
|
264
|
+
return void 0;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function deriveInteractable(type, handlerNames) {
|
|
268
|
+
if (INTERACTIVE_TYPES.has(type)) return true;
|
|
269
|
+
if (handlerNames) {
|
|
270
|
+
for (const name of handlerNames) {
|
|
271
|
+
if (INTERACTIVE_HANDLER_NAMES.has(name)) return true;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
function deriveText(state, label) {
|
|
277
|
+
const candidates = [state.value, state.textContent, label];
|
|
278
|
+
for (const c of candidates) {
|
|
279
|
+
if (typeof c === "string") {
|
|
280
|
+
const trimmed = c.trim();
|
|
281
|
+
if (trimmed.length > 0) return trimmed;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return void 0;
|
|
285
|
+
}
|
|
286
|
+
var NAMED_COLORS = {
|
|
287
|
+
black: { r: 0, g: 0, b: 0 },
|
|
288
|
+
white: { r: 255, g: 255, b: 255 },
|
|
289
|
+
red: { r: 255, g: 0, b: 0 },
|
|
290
|
+
green: { r: 0, g: 128, b: 0 },
|
|
291
|
+
blue: { r: 0, g: 0, b: 255 },
|
|
292
|
+
gray: { r: 128, g: 128, b: 128 },
|
|
293
|
+
grey: { r: 128, g: 128, b: 128 },
|
|
294
|
+
silver: { r: 192, g: 192, b: 192 },
|
|
295
|
+
transparent: { r: 0, g: 0, b: 0 },
|
|
296
|
+
orange: { r: 255, g: 165, b: 0 },
|
|
297
|
+
yellow: { r: 255, g: 255, b: 0 },
|
|
298
|
+
purple: { r: 128, g: 0, b: 128 },
|
|
299
|
+
navy: { r: 0, g: 0, b: 128 }
|
|
300
|
+
};
|
|
301
|
+
var clamp255 = (n) => Math.max(0, Math.min(255, Math.round(n)));
|
|
302
|
+
function parseColorToRgb(input) {
|
|
303
|
+
if (typeof input !== "string") return void 0;
|
|
304
|
+
const raw = input.trim().toLowerCase();
|
|
305
|
+
if (raw.length === 0) return void 0;
|
|
306
|
+
if (Object.prototype.hasOwnProperty.call(NAMED_COLORS, raw)) {
|
|
307
|
+
return NAMED_COLORS[raw];
|
|
308
|
+
}
|
|
309
|
+
if (raw.startsWith("#")) {
|
|
310
|
+
const hex = raw.slice(1);
|
|
311
|
+
if (hex.length === 3 || hex.length === 4) {
|
|
312
|
+
const r = parseInt(hex[0] + hex[0], 16);
|
|
313
|
+
const g = parseInt(hex[1] + hex[1], 16);
|
|
314
|
+
const b = parseInt(hex[2] + hex[2], 16);
|
|
315
|
+
if ([r, g, b].every((v) => Number.isFinite(v))) return { r, g, b };
|
|
316
|
+
return void 0;
|
|
317
|
+
}
|
|
318
|
+
if (hex.length === 6 || hex.length === 8) {
|
|
319
|
+
const r = parseInt(hex.slice(0, 2), 16);
|
|
320
|
+
const g = parseInt(hex.slice(2, 4), 16);
|
|
321
|
+
const b = parseInt(hex.slice(4, 6), 16);
|
|
322
|
+
if ([r, g, b].every((v) => Number.isFinite(v))) return { r, g, b };
|
|
323
|
+
return void 0;
|
|
324
|
+
}
|
|
325
|
+
return void 0;
|
|
326
|
+
}
|
|
327
|
+
const rgbMatch = raw.match(/^rgba?\(([^)]+)\)$/);
|
|
328
|
+
if (rgbMatch) {
|
|
329
|
+
const parts = rgbMatch[1].split(",").map((p) => p.trim());
|
|
330
|
+
if (parts.length < 3) return void 0;
|
|
331
|
+
const channel = (p) => {
|
|
332
|
+
if (p.endsWith("%")) {
|
|
333
|
+
const pct = parseFloat(p.slice(0, -1));
|
|
334
|
+
if (!Number.isFinite(pct)) return void 0;
|
|
335
|
+
return clamp255(pct / 100 * 255);
|
|
336
|
+
}
|
|
337
|
+
const n = parseFloat(p);
|
|
338
|
+
if (!Number.isFinite(n)) return void 0;
|
|
339
|
+
return clamp255(n);
|
|
340
|
+
};
|
|
341
|
+
const r = channel(parts[0]);
|
|
342
|
+
const g = channel(parts[1]);
|
|
343
|
+
const b = channel(parts[2]);
|
|
344
|
+
if (r === void 0 || g === void 0 || b === void 0) return void 0;
|
|
345
|
+
return { r, g, b };
|
|
346
|
+
}
|
|
347
|
+
return void 0;
|
|
348
|
+
}
|
|
349
|
+
function parseFontSizePx(input) {
|
|
350
|
+
if (typeof input === "number") {
|
|
351
|
+
return Number.isFinite(input) && input > 0 ? input : void 0;
|
|
352
|
+
}
|
|
353
|
+
if (typeof input === "string") {
|
|
354
|
+
const m = input.trim().match(/^(-?\d*\.?\d+)/);
|
|
355
|
+
if (m) {
|
|
356
|
+
const n = parseFloat(m[1]);
|
|
357
|
+
return Number.isFinite(n) && n > 0 ? n : void 0;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return void 0;
|
|
361
|
+
}
|
|
362
|
+
function projectVisionFields(args) {
|
|
363
|
+
const { type, label, handlerNames, state, flatStyle } = args;
|
|
364
|
+
const fields = {
|
|
365
|
+
interactable: deriveInteractable(type, handlerNames)
|
|
366
|
+
};
|
|
367
|
+
const text = deriveText(state, label);
|
|
368
|
+
if (text !== void 0) fields.text = text;
|
|
369
|
+
const role = roleForType(type);
|
|
370
|
+
if (role !== void 0) fields.role = role;
|
|
371
|
+
if (flatStyle) {
|
|
372
|
+
const fg = parseColorToRgb(flatStyle.color);
|
|
373
|
+
if (fg !== void 0) fields.fg_color = fg;
|
|
374
|
+
const bg = parseColorToRgb(flatStyle.backgroundColor);
|
|
375
|
+
if (bg !== void 0) fields.bg_color = bg;
|
|
376
|
+
const size = parseFontSizePx(flatStyle.fontSize);
|
|
377
|
+
if (size !== void 0) fields.font_size_px = size;
|
|
378
|
+
if (typeof flatStyle.fontFamily === "string" && flatStyle.fontFamily.trim().length > 0) {
|
|
379
|
+
fields.font_family = flatStyle.fontFamily;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return fields;
|
|
383
|
+
}
|
|
384
|
+
|
|
212
385
|
// src/core/registry.ts
|
|
213
386
|
function extractHandlerNames(props) {
|
|
214
387
|
if (!props) return [];
|
|
@@ -218,6 +391,25 @@ function matchesCurrentRoute(registrationRoute, currentRoute) {
|
|
|
218
391
|
if (registrationRoute == null || registrationRoute === "") return true;
|
|
219
392
|
return registrationRoute === currentRoute;
|
|
220
393
|
}
|
|
394
|
+
function projectBbox(state, visibility, pixelRatio = 1) {
|
|
395
|
+
if (visibility !== "visible") return void 0;
|
|
396
|
+
const layout = state.layout;
|
|
397
|
+
if (!layout) return void 0;
|
|
398
|
+
const ratio = pixelRatio > 0 && Number.isFinite(pixelRatio) ? pixelRatio : 1;
|
|
399
|
+
const toPx = (v) => Math.max(0, Math.round(v * ratio));
|
|
400
|
+
const hasPage = typeof layout.pageX === "number" && typeof layout.pageY === "number" && Number.isFinite(layout.pageX) && Number.isFinite(layout.pageY);
|
|
401
|
+
const originX = hasPage ? layout.pageX : layout.x;
|
|
402
|
+
const originY = hasPage ? layout.pageY : layout.y;
|
|
403
|
+
if (typeof originX !== "number" || typeof originY !== "number" || typeof layout.width !== "number" || typeof layout.height !== "number" || !Number.isFinite(originX) || !Number.isFinite(originY) || !Number.isFinite(layout.width) || !Number.isFinite(layout.height)) {
|
|
404
|
+
return void 0;
|
|
405
|
+
}
|
|
406
|
+
return {
|
|
407
|
+
x: toPx(originX),
|
|
408
|
+
y: toPx(originY),
|
|
409
|
+
w: toPx(layout.width),
|
|
410
|
+
h: toPx(layout.height)
|
|
411
|
+
};
|
|
412
|
+
}
|
|
221
413
|
|
|
222
414
|
// src/design/design-inspector-native.ts
|
|
223
415
|
function toCssValue(value) {
|
|
@@ -695,7 +887,7 @@ function createDesignHandlers(registry, viewportProvider) {
|
|
|
695
887
|
var GRID_SIZE = 20;
|
|
696
888
|
var NAV_TYPES = /* @__PURE__ */ new Set(["button", "heading", "badge", "status-message"]);
|
|
697
889
|
var SKIP_TEXT_TYPES = /* @__PURE__ */ new Set(["button", "link", "tab", "menuitem"]);
|
|
698
|
-
var
|
|
890
|
+
var INTERACTIVE_TYPES2 = /* @__PURE__ */ new Set([
|
|
699
891
|
"button",
|
|
700
892
|
"input",
|
|
701
893
|
"switch",
|
|
@@ -892,7 +1084,7 @@ function diagnosePageHealth(elements, viewport) {
|
|
|
892
1084
|
let interactiveTotal = 0;
|
|
893
1085
|
let interactiveDisabled = 0;
|
|
894
1086
|
for (const el of elements) {
|
|
895
|
-
if (!
|
|
1087
|
+
if (!INTERACTIVE_TYPES2.has(el.type)) continue;
|
|
896
1088
|
interactiveTotal++;
|
|
897
1089
|
if (el.state.enabled === false) interactiveDisabled++;
|
|
898
1090
|
}
|
|
@@ -960,6 +1152,13 @@ function matchElementsByText(registry, text, opts) {
|
|
|
960
1152
|
scored.sort((a, b) => a.rank - b.rank);
|
|
961
1153
|
return scored.map((s) => s.element);
|
|
962
1154
|
}
|
|
1155
|
+
function resolveElementState(element) {
|
|
1156
|
+
const state = element.getState();
|
|
1157
|
+
if (element.type === "input" && state.value === void 0 && typeof element.props?.value === "string") {
|
|
1158
|
+
return { ...state, value: element.props.value };
|
|
1159
|
+
}
|
|
1160
|
+
return state;
|
|
1161
|
+
}
|
|
963
1162
|
async function executeWorkflowStep(step, registry, executor) {
|
|
964
1163
|
const startTime = Date.now();
|
|
965
1164
|
try {
|
|
@@ -1168,6 +1367,16 @@ function createServerHandlers(registry, executor, config) {
|
|
|
1168
1367
|
const handlers = extractHandlerNames(e.props);
|
|
1169
1368
|
const state = e.getState();
|
|
1170
1369
|
const visibility = !state.visible ? "hidden" : state.layout !== null ? "visible" : "likely-visible";
|
|
1370
|
+
const bbox = projectBbox(state, visibility, registry.getPixelRatio());
|
|
1371
|
+
const vision = projectVisionFields({
|
|
1372
|
+
type: e.type,
|
|
1373
|
+
label: e.label,
|
|
1374
|
+
// Real handler names (onPress/...), NOT inferred actions which
|
|
1375
|
+
// synthesize press/click onto every element. See projectVisionFields.
|
|
1376
|
+
handlerNames: handlers,
|
|
1377
|
+
state,
|
|
1378
|
+
flatStyle: e.flatStyle
|
|
1379
|
+
});
|
|
1171
1380
|
return {
|
|
1172
1381
|
id: e.id,
|
|
1173
1382
|
type: e.type,
|
|
@@ -1178,7 +1387,9 @@ function createServerHandlers(registry, executor, config) {
|
|
|
1178
1387
|
customActions: e.customActions ? Object.keys(e.customActions) : void 0,
|
|
1179
1388
|
registeredHandlers: handlers.length > 0 ? handlers : void 0,
|
|
1180
1389
|
registrationRoute: e.registrationRoute,
|
|
1181
|
-
visibility
|
|
1390
|
+
visibility,
|
|
1391
|
+
...bbox ? { bbox } : {},
|
|
1392
|
+
...vision
|
|
1182
1393
|
};
|
|
1183
1394
|
});
|
|
1184
1395
|
return success2({ elements });
|
|
@@ -1196,7 +1407,7 @@ function createServerHandlers(registry, executor, config) {
|
|
|
1196
1407
|
type: element.type,
|
|
1197
1408
|
label: element.label,
|
|
1198
1409
|
identifier: element.getIdentifier(),
|
|
1199
|
-
state: element
|
|
1410
|
+
state: resolveElementState(element),
|
|
1200
1411
|
actions: element.actions,
|
|
1201
1412
|
customActions: element.customActions ? Object.keys(element.customActions) : void 0,
|
|
1202
1413
|
registeredHandlers: handlers.length > 0 ? handlers : void 0,
|
|
@@ -1210,18 +1421,19 @@ function createServerHandlers(registry, executor, config) {
|
|
|
1210
1421
|
if (!element) {
|
|
1211
1422
|
return error2(`Element not found: ${id}`, "ELEMENT_NOT_FOUND");
|
|
1212
1423
|
}
|
|
1213
|
-
return success2({ state: element
|
|
1424
|
+
return success2({ state: resolveElementState(element) });
|
|
1214
1425
|
},
|
|
1215
1426
|
executeAction: async (ctx) => {
|
|
1216
|
-
const
|
|
1217
|
-
const
|
|
1218
|
-
|
|
1427
|
+
const rawBody = ctx.body ?? {};
|
|
1428
|
+
const envelope = rawBody.request && typeof rawBody.request === "object" ? rawBody.request : rawBody;
|
|
1429
|
+
const id = ctx.params.id ?? rawBody.id ?? "";
|
|
1430
|
+
if (!envelope?.action) {
|
|
1219
1431
|
return error2("Action is required", "INVALID_REQUEST");
|
|
1220
1432
|
}
|
|
1221
1433
|
const response = await executor.executeAction(id, {
|
|
1222
|
-
action:
|
|
1223
|
-
params:
|
|
1224
|
-
waitOptions:
|
|
1434
|
+
action: envelope.action,
|
|
1435
|
+
params: envelope.params,
|
|
1436
|
+
waitOptions: envelope.waitOptions
|
|
1225
1437
|
});
|
|
1226
1438
|
if (!response.success) {
|
|
1227
1439
|
return error2(response.error || "Action failed", "ACTION_FAILED");
|
|
@@ -1860,7 +2072,7 @@ function createServerHandlers(registry, executor, config) {
|
|
|
1860
2072
|
};
|
|
1861
2073
|
if (config?.appInfo) {
|
|
1862
2074
|
response.uiBridge = {
|
|
1863
|
-
version: "0.
|
|
2075
|
+
version: "0.6.11",
|
|
1864
2076
|
...config.appInfo,
|
|
1865
2077
|
capabilities: ["elements", "components", "actions", "design"],
|
|
1866
2078
|
elementCount: stats.elements,
|
|
@@ -2452,6 +2664,14 @@ var NativeUIBridgeServer = class {
|
|
|
2452
2664
|
};
|
|
2453
2665
|
};
|
|
2454
2666
|
}
|
|
2667
|
+
/**
|
|
2668
|
+
* Whether the console/network capture should be installed. The dedicated
|
|
2669
|
+
* `observability` flag wins when set; otherwise falls back to `testHooks`
|
|
2670
|
+
* so consumers predating the flag keep their exact behavior.
|
|
2671
|
+
*/
|
|
2672
|
+
observabilityEnabled() {
|
|
2673
|
+
return this.config.observability ?? this.config.testHooks === true;
|
|
2674
|
+
}
|
|
2455
2675
|
/**
|
|
2456
2676
|
* Set the server adapter
|
|
2457
2677
|
*/
|
|
@@ -2665,7 +2885,7 @@ var NativeUIBridgeServer = class {
|
|
|
2665
2885
|
console.warn("[ui-bridge-native] See documentation for supported adapters.");
|
|
2666
2886
|
return;
|
|
2667
2887
|
}
|
|
2668
|
-
if (this.
|
|
2888
|
+
if (this.observabilityEnabled()) {
|
|
2669
2889
|
this.consoleErrorBuffer.install();
|
|
2670
2890
|
this.networkRequestBuffer.install();
|
|
2671
2891
|
}
|
|
@@ -3986,6 +4206,46 @@ var WebSocketConnection = class {
|
|
|
3986
4206
|
}
|
|
3987
4207
|
};
|
|
3988
4208
|
|
|
4209
|
+
// src/server/bind-retry.ts
|
|
4210
|
+
function isAddrInUseError(err) {
|
|
4211
|
+
const message = err instanceof Error ? err.message : typeof err === "string" ? err : String(err);
|
|
4212
|
+
const code = err?.code;
|
|
4213
|
+
return message.includes("EADDRINUSE") || message.toLowerCase().includes("address already in use") || code === "EADDRINUSE";
|
|
4214
|
+
}
|
|
4215
|
+
var defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
4216
|
+
async function bindWithRetry(attempt, options = {}) {
|
|
4217
|
+
const {
|
|
4218
|
+
minTotalMs = 3e4,
|
|
4219
|
+
initialDelayMs = 500,
|
|
4220
|
+
maxDelayMs = 5e3,
|
|
4221
|
+
backoffFactor = 2,
|
|
4222
|
+
logger = console,
|
|
4223
|
+
sleep = defaultSleep,
|
|
4224
|
+
now = Date.now
|
|
4225
|
+
} = options;
|
|
4226
|
+
const startedAt = now();
|
|
4227
|
+
let delay = initialDelayMs;
|
|
4228
|
+
let attemptIndex = 0;
|
|
4229
|
+
for (; ; ) {
|
|
4230
|
+
try {
|
|
4231
|
+
await attempt(attemptIndex);
|
|
4232
|
+
return;
|
|
4233
|
+
} catch (err) {
|
|
4234
|
+
const elapsed = now() - startedAt;
|
|
4235
|
+
const budgetExhausted = elapsed + delay >= minTotalMs;
|
|
4236
|
+
if (!isAddrInUseError(err) || budgetExhausted) {
|
|
4237
|
+
throw err;
|
|
4238
|
+
}
|
|
4239
|
+
logger.warn(
|
|
4240
|
+
`[ui-bridge-native] bind failed with EADDRINUSE (attempt ${attemptIndex + 1}); retrying in ${delay}ms (elapsed ${elapsed}ms / budget ${minTotalMs === Infinity ? "\u221E" : minTotalMs}ms)`
|
|
4241
|
+
);
|
|
4242
|
+
await sleep(delay);
|
|
4243
|
+
delay = Math.min(delay * backoffFactor, maxDelayMs);
|
|
4244
|
+
attemptIndex += 1;
|
|
4245
|
+
}
|
|
4246
|
+
}
|
|
4247
|
+
}
|
|
4248
|
+
|
|
3989
4249
|
exports.ConsoleErrorBuffer = ConsoleErrorBuffer;
|
|
3990
4250
|
exports.NativeUIBridgeServer = NativeUIBridgeServer;
|
|
3991
4251
|
exports.NetworkRequestBuffer = NetworkRequestBuffer;
|
|
@@ -3998,6 +4258,7 @@ exports.OPCODE_TEXT = OPCODE_TEXT;
|
|
|
3998
4258
|
exports.UI_BRIDGE_NATIVE_ROUTES = UI_BRIDGE_NATIVE_ROUTES;
|
|
3999
4259
|
exports.WebSocketConnection = WebSocketConnection;
|
|
4000
4260
|
exports.WebSocketEventBridge = WebSocketEventBridge;
|
|
4261
|
+
exports.bindWithRetry = bindWithRetry;
|
|
4001
4262
|
exports.buildUpgradeResponse = buildUpgradeResponse;
|
|
4002
4263
|
exports.computeAcceptKey = computeAcceptKey;
|
|
4003
4264
|
exports.createDesignHandlers = createDesignHandlers;
|
|
@@ -4009,6 +4270,7 @@ exports.encodeCloseFrame = encodeCloseFrame;
|
|
|
4009
4270
|
exports.encodePingFrame = encodePingFrame;
|
|
4010
4271
|
exports.encodePongFrame = encodePongFrame;
|
|
4011
4272
|
exports.encodeTextFrame = encodeTextFrame;
|
|
4273
|
+
exports.isAddrInUseError = isAddrInUseError;
|
|
4012
4274
|
exports.isBatchRequest = isBatchRequest;
|
|
4013
4275
|
exports.isSubscribe = isSubscribe;
|
|
4014
4276
|
exports.isUnsubscribe = isUnsubscribe;
|