@geometra/server 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +18 -4
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +20 -4
- package/dist/protocol.js.map +1 -1
- package/dist/server.d.ts +20 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +51 -3
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -10,7 +10,8 @@ npm install @geometra/server
|
|
|
10
10
|
|
|
11
11
|
## Key exports
|
|
12
12
|
|
|
13
|
-
- `createServer` — Geometra layout server with WebSocket streaming
|
|
13
|
+
- `createServer` — Geometra layout server with WebSocket streaming (standalone `port` **or** attach to an existing HTTP server)
|
|
14
|
+
- `DEFAULT_GEOMETRA_WS_PATH` — default pathname (`/geometra-ws`) when using `httpServer`
|
|
14
15
|
- `shouldDeferClientSend` — backpressure helper (used by the server and tests)
|
|
15
16
|
- `onTransportMetrics` (option) — per-broadcast deferred send count, coalesced patch delta, binary outbound count
|
|
16
17
|
- Binary frame helpers (`encodeBinaryFrameJson`, …) — optional GEOM v1 JSON envelopes; see repo `PROTOCOL_COMPATIBILITY.md`
|
|
@@ -36,6 +37,46 @@ function view() {
|
|
|
36
37
|
const server = await createServer(view, { port: 3100, width: 800, height: 500 })
|
|
37
38
|
```
|
|
38
39
|
|
|
40
|
+
### One port: HTTP + WebSocket (attach mode)
|
|
41
|
+
|
|
42
|
+
Serve static files, REST, and Geometra on the same TCP port by passing your Node `http.Server`. WebSocket clients should connect to `ws(s)://host${wsPath}` (default path `DEFAULT_GEOMETRA_WS_PATH`).
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import http from 'node:http'
|
|
46
|
+
import { signal, box, text } from '@geometra/core/node'
|
|
47
|
+
import { createServer, DEFAULT_GEOMETRA_WS_PATH } from '@geometra/server'
|
|
48
|
+
|
|
49
|
+
const count = signal(0)
|
|
50
|
+
|
|
51
|
+
function view() {
|
|
52
|
+
return box({ padding: 16 }, [
|
|
53
|
+
text({ text: `Count ${count.value}`, font: '16px Inter', lineHeight: 22, color: '#fff' }),
|
|
54
|
+
])
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const httpServer = http.createServer((req, res) => {
|
|
58
|
+
if (req.url === '/') {
|
|
59
|
+
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
60
|
+
res.end('<!doctype html><canvas id="app"></canvas><script type="module" src="/client.js"></script>')
|
|
61
|
+
return
|
|
62
|
+
}
|
|
63
|
+
res.writeHead(404).end()
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
await new Promise<void>((resolve) => httpServer.listen(8080, resolve))
|
|
67
|
+
|
|
68
|
+
const geometra = await createServer(view, {
|
|
69
|
+
httpServer,
|
|
70
|
+
wsPath: DEFAULT_GEOMETRA_WS_PATH,
|
|
71
|
+
width: 800,
|
|
72
|
+
height: 600,
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
// Thin client: new WebSocket(`ws://localhost:8080${DEFAULT_GEOMETRA_WS_PATH}`)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Do not pass both `httpServer` and `port`.
|
|
79
|
+
|
|
39
80
|
## Links
|
|
40
81
|
|
|
41
82
|
- [Main repo](https://github.com/AiGeekz/geometra)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createServer, shouldDeferClientSend } from './server.js';
|
|
1
|
+
export { createServer, shouldDeferClientSend, DEFAULT_GEOMETRA_WS_PATH, } from './server.js';
|
|
2
2
|
export type { TexturaServer, TexturaServerOptions, ServerTransportMetrics } from './server.js';
|
|
3
3
|
export { diffLayout, CLOSE_AUTH_FAILED, CLOSE_FORBIDDEN } from './protocol.js';
|
|
4
4
|
export type { ServerMessage, ClientMessage, LayoutPatch } from './protocol.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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAC9F,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC9E,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createServer, shouldDeferClientSend } from './server.js';
|
|
1
|
+
export { createServer, shouldDeferClientSend, DEFAULT_GEOMETRA_WS_PATH, } from './server.js';
|
|
2
2
|
export { diffLayout, CLOSE_AUTH_FAILED, CLOSE_FORBIDDEN } from './protocol.js';
|
|
3
3
|
export { encodeBinaryFrameJson, decodeBinaryFrameJson, isBinaryFrameBuffer } from './binary-frame.js';
|
|
4
4
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE9E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -8,9 +8,15 @@ export declare const CLOSE_AUTH_FAILED = 4001;
|
|
|
8
8
|
export declare const CLOSE_FORBIDDEN = 4003;
|
|
9
9
|
/**
|
|
10
10
|
* Protocol compatibility rule:
|
|
11
|
-
* - undefined means legacy v1 and is accepted.
|
|
12
|
-
* - newer peer versions are rejected explicitly.
|
|
13
|
-
* - equal/older versions are accepted for backward compatibility.
|
|
11
|
+
* - `undefined` means legacy v1 and is accepted.
|
|
12
|
+
* - newer peer versions are rejected explicitly (`peerVersion > currentVersion`).
|
|
13
|
+
* - equal/older finite versions are accepted for backward compatibility.
|
|
14
|
+
*
|
|
15
|
+
* Non-finite numeric `peerVersion` values (`NaN`, `±Infinity`) yield `false` — they are not treated as legacy
|
|
16
|
+
* — so corrupt wire numbers fail closed instead of connecting.
|
|
17
|
+
*
|
|
18
|
+
* Non-number runtime values (e.g. `BigInt` from a malformed decoder) are rejected via the `typeof`
|
|
19
|
+
* check before `Number.isFinite` — we never coerce wire values (global `isFinite` throws on `BigInt`).
|
|
14
20
|
*/
|
|
15
21
|
export declare function isProtocolCompatible(peerVersion: number | undefined, currentVersion?: number): boolean;
|
|
16
22
|
interface VersionedMessage {
|
|
@@ -67,7 +73,15 @@ export interface LayoutPatch {
|
|
|
67
73
|
}
|
|
68
74
|
/** Coalesce multiple patches on the same path (last write wins per field). */
|
|
69
75
|
export declare function coalescePatches(patches: LayoutPatch[]): LayoutPatch[];
|
|
70
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Diff two computed layouts and return patches for changed nodes.
|
|
78
|
+
*
|
|
79
|
+
* Only pairs existing children by index: if `prev.children` and `next.children` differ in length,
|
|
80
|
+
* extra slots on either side are ignored (no patches for “added” or “removed” subtrees). The server
|
|
81
|
+
* only uses patches when the UI tree JSON is unchanged (`createServer` sends full `frame` messages
|
|
82
|
+
* whenever the tree changes), so callers should not rely on this function across structural layout
|
|
83
|
+
* mismatches.
|
|
84
|
+
*/
|
|
71
85
|
export declare function diffLayout(prev: ComputedLayout, next: ComputedLayout, path?: number[]): LayoutPatch[];
|
|
72
86
|
export {};
|
|
73
87
|
//# sourceMappingURL=protocol.d.ts.map
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,IAAI,CAAA;AAEjC,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,OAAO,CAAA;AAErC,gEAAgE;AAChE,eAAO,MAAM,eAAe,OAAO,CAAA;AAEnC
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,IAAI,CAAA;AAEjC,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,OAAO,CAAA;AAErC,gEAAgE;AAChE,eAAO,MAAM,eAAe,OAAO,CAAA;AAEnC;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,cAAc,SAAmB,GAChC,OAAO,CAIT;AAED,UAAU,gBAAgB;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GACrB,CAAC,gBAAgB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GAC/E,CAAC,gBAAgB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,GAC9D,CAAC,gBAAgB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAE1E,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GACrB,CAAC,gBAAgB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/E,CAAC,gBAAgB,GAAG;IAClB,IAAI,EAAE,KAAK,CAAA;IACX,SAAS,EAAE,WAAW,GAAG,SAAS,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;CAChB,CAAC,GACF,CAAC,gBAAgB,GAAG;IAClB,IAAI,EAAE,aAAa,CAAA;IACnB,SAAS,EAAE,oBAAoB,GAAG,qBAAqB,GAAG,kBAAkB,CAAA;IAC5E,IAAI,EAAE,MAAM,CAAA;CACb,CAAC,GACF,CAAC,gBAAgB,GAAG;IAClB,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,YAAY,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAC3C,CAAC,CAAA;AAEN,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAgBrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,MAAM,EAAO,GAClB,WAAW,EAAE,CAuBf"}
|
package/dist/protocol.js
CHANGED
|
@@ -6,13 +6,21 @@ export const CLOSE_AUTH_FAILED = 4001;
|
|
|
6
6
|
export const CLOSE_FORBIDDEN = 4003;
|
|
7
7
|
/**
|
|
8
8
|
* Protocol compatibility rule:
|
|
9
|
-
* - undefined means legacy v1 and is accepted.
|
|
10
|
-
* - newer peer versions are rejected explicitly.
|
|
11
|
-
* - equal/older versions are accepted for backward compatibility.
|
|
9
|
+
* - `undefined` means legacy v1 and is accepted.
|
|
10
|
+
* - newer peer versions are rejected explicitly (`peerVersion > currentVersion`).
|
|
11
|
+
* - equal/older finite versions are accepted for backward compatibility.
|
|
12
|
+
*
|
|
13
|
+
* Non-finite numeric `peerVersion` values (`NaN`, `±Infinity`) yield `false` — they are not treated as legacy
|
|
14
|
+
* — so corrupt wire numbers fail closed instead of connecting.
|
|
15
|
+
*
|
|
16
|
+
* Non-number runtime values (e.g. `BigInt` from a malformed decoder) are rejected via the `typeof`
|
|
17
|
+
* check before `Number.isFinite` — we never coerce wire values (global `isFinite` throws on `BigInt`).
|
|
12
18
|
*/
|
|
13
19
|
export function isProtocolCompatible(peerVersion, currentVersion = PROTOCOL_VERSION) {
|
|
14
20
|
if (peerVersion === undefined)
|
|
15
21
|
return true;
|
|
22
|
+
if (typeof peerVersion !== 'number' || !Number.isFinite(peerVersion))
|
|
23
|
+
return false;
|
|
16
24
|
return peerVersion <= currentVersion;
|
|
17
25
|
}
|
|
18
26
|
/** Coalesce multiple patches on the same path (last write wins per field). */
|
|
@@ -37,7 +45,15 @@ export function coalescePatches(patches) {
|
|
|
37
45
|
}
|
|
38
46
|
return order.map(k => byPath.get(k));
|
|
39
47
|
}
|
|
40
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Diff two computed layouts and return patches for changed nodes.
|
|
50
|
+
*
|
|
51
|
+
* Only pairs existing children by index: if `prev.children` and `next.children` differ in length,
|
|
52
|
+
* extra slots on either side are ignored (no patches for “added” or “removed” subtrees). The server
|
|
53
|
+
* only uses patches when the UI tree JSON is unchanged (`createServer` sends full `frame` messages
|
|
54
|
+
* whenever the tree changes), so callers should not rely on this function across structural layout
|
|
55
|
+
* mismatches.
|
|
56
|
+
*/
|
|
41
57
|
export function diffLayout(prev, next, path = []) {
|
|
42
58
|
const patches = [];
|
|
43
59
|
const patch = { path };
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAGA,sFAAsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAEjC,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAA;AAErC,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AAEnC
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
|
-
import type { IncomingMessage } from 'http';
|
|
1
|
+
import type { IncomingMessage, Server as HttpServer } from 'node:http';
|
|
2
2
|
import type { UIElement } from '@geometra/core';
|
|
3
3
|
import type { ClientMessage } from './protocol.js';
|
|
4
|
+
/** Default WebSocket pathname when attaching to an existing HTTP server. */
|
|
5
|
+
export declare const DEFAULT_GEOMETRA_WS_PATH = "/geometra-ws";
|
|
4
6
|
export interface TexturaServerOptions {
|
|
5
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Existing Node HTTP server to attach the Geometra WebSocket to (via `upgrade`).
|
|
9
|
+
* When set, do not pass `port` — the WS endpoint listens on `wsPath` only.
|
|
10
|
+
* Use this to serve static files, REST APIs, and Geometra on one TCP port.
|
|
11
|
+
*/
|
|
12
|
+
httpServer?: HttpServer;
|
|
13
|
+
/**
|
|
14
|
+
* URL pathname for WebSocket upgrades when `httpServer` is set.
|
|
15
|
+
* Default {@link DEFAULT_GEOMETRA_WS_PATH}.
|
|
16
|
+
*/
|
|
17
|
+
wsPath?: string;
|
|
18
|
+
/** Port to listen on when `httpServer` is omitted. Default: 3100. */
|
|
6
19
|
port?: number;
|
|
7
20
|
/** Root width. Default: 800. */
|
|
8
21
|
width?: number;
|
|
@@ -29,6 +42,11 @@ export interface TexturaServerOptions {
|
|
|
29
42
|
backpressureBytes?: number;
|
|
30
43
|
/** Per-broadcast transport telemetry (backpressure, coalescing, binary outbound). */
|
|
31
44
|
onTransportMetrics?: (metrics: ServerTransportMetrics) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Yoga / Textura root layout direction. When omitted, derived from the view root’s resolved `dir`
|
|
47
|
+
* (parent context defaults to `ltr`).
|
|
48
|
+
*/
|
|
49
|
+
layoutDirection?: 'ltr' | 'rtl';
|
|
32
50
|
}
|
|
33
51
|
/** Emitted after each successful broadcast (not on early no-op returns). */
|
|
34
52
|
export interface ServerTransportMetrics {
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAWtE,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAA;AAE9D,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,eAAe,CAAA;AAGjE,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,iBAAiB,CAAA;AAEtD,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACvE,mFAAmF;IACnF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACzC;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;IACjE,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAA;IAC9D;;;OAGG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;CAChC;AAED,4EAA4E;AAC5E,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAA;IACrB,kFAAkF;IAClF,mBAAmB,EAAE,MAAM,CAAA;IAC3B,0EAA0E;IAC1E,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,MAAM,IAAI,IAAI,CAAA;IACd,4BAA4B;IAC5B,KAAK,IAAI,IAAI,CAAA;CACd;AAED,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAET;AAyBD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,SAAS,EACrB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CA8PxB"}
|
package/dist/server.js
CHANGED
|
@@ -1,11 +1,35 @@
|
|
|
1
1
|
import { WebSocketServer } from 'ws';
|
|
2
2
|
import { init, computeLayout } from 'textura';
|
|
3
|
-
import { toLayoutTree, dispatchHit, dispatchKeyboardEvent, dispatchCompositionEvent, } from '@geometra/core';
|
|
3
|
+
import { toLayoutTree, resolveElementDirection, dispatchHit, dispatchKeyboardEvent, dispatchCompositionEvent, } from '@geometra/core';
|
|
4
4
|
import { diffLayout, coalescePatches, PROTOCOL_VERSION, isProtocolCompatible, CLOSE_AUTH_FAILED, CLOSE_FORBIDDEN } from './protocol.js';
|
|
5
5
|
import { encodeBinaryFrameJson } from './binary-frame.js';
|
|
6
|
+
/** Default WebSocket pathname when attaching to an existing HTTP server. */
|
|
7
|
+
export const DEFAULT_GEOMETRA_WS_PATH = '/geometra-ws';
|
|
6
8
|
export function shouldDeferClientSend(bufferedAmount, backpressureBytes) {
|
|
7
9
|
return bufferedAmount > backpressureBytes;
|
|
8
10
|
}
|
|
11
|
+
function normalizeWsPath(pathname) {
|
|
12
|
+
let p = pathname.trim();
|
|
13
|
+
if (!p.startsWith('/')) {
|
|
14
|
+
p = `/${p}`;
|
|
15
|
+
}
|
|
16
|
+
if (p.length > 1 && p.endsWith('/')) {
|
|
17
|
+
p = p.slice(0, -1);
|
|
18
|
+
}
|
|
19
|
+
return p;
|
|
20
|
+
}
|
|
21
|
+
function upgradePathMatches(request, wsPath) {
|
|
22
|
+
const host = request.headers.host ?? 'localhost';
|
|
23
|
+
try {
|
|
24
|
+
const pathname = new URL(request.url ?? '/', `http://${host}`).pathname;
|
|
25
|
+
const norm = normalizeWsPath(wsPath);
|
|
26
|
+
const reqPath = normalizeWsPath(pathname);
|
|
27
|
+
return reqPath === norm;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
9
33
|
/**
|
|
10
34
|
* Create a Textura server that computes layout and streams geometry to clients.
|
|
11
35
|
*
|
|
@@ -14,7 +38,11 @@ export function shouldDeferClientSend(bufferedAmount, backpressureBytes) {
|
|
|
14
38
|
*/
|
|
15
39
|
export async function createServer(view, options = {}) {
|
|
16
40
|
await init();
|
|
41
|
+
if (options.httpServer != null && options.port !== undefined) {
|
|
42
|
+
throw new Error('createServer: pass either httpServer (attach mode) or port (standalone), not both');
|
|
43
|
+
}
|
|
17
44
|
const port = options.port ?? 3100;
|
|
45
|
+
const wsPathNormalized = normalizeWsPath(options.wsPath ?? DEFAULT_GEOMETRA_WS_PATH);
|
|
18
46
|
let width = options.width ?? 800;
|
|
19
47
|
let height = options.height ?? 600;
|
|
20
48
|
const clients = new Set();
|
|
@@ -26,12 +54,14 @@ export async function createServer(view, options = {}) {
|
|
|
26
54
|
let currentTree = null;
|
|
27
55
|
let prevSerializedTree = null;
|
|
28
56
|
const backpressureBytes = Math.max(1024, options.backpressureBytes ?? 512 * 1024);
|
|
57
|
+
const layoutDirectionOption = options.layoutDirection;
|
|
29
58
|
function computeAndBroadcast() {
|
|
30
59
|
try {
|
|
31
60
|
currentTree = view();
|
|
32
61
|
const serializedTree = JSON.stringify(currentTree);
|
|
33
62
|
const layoutTree = toLayoutTree(currentTree);
|
|
34
|
-
const
|
|
63
|
+
const direction = layoutDirectionOption ?? resolveElementDirection(currentTree, 'ltr');
|
|
64
|
+
const layout = computeLayout(layoutTree, { width, height, direction });
|
|
35
65
|
let msg;
|
|
36
66
|
let coalescedPatchDelta = 0;
|
|
37
67
|
const treeChanged = prevSerializedTree !== serializedTree;
|
|
@@ -101,7 +131,21 @@ export async function createServer(view, options = {}) {
|
|
|
101
131
|
}
|
|
102
132
|
}
|
|
103
133
|
}
|
|
104
|
-
const wss =
|
|
134
|
+
const wss = options.httpServer != null
|
|
135
|
+
? new WebSocketServer({ noServer: true })
|
|
136
|
+
: new WebSocketServer({ port });
|
|
137
|
+
let upgradeHandler = null;
|
|
138
|
+
if (options.httpServer != null) {
|
|
139
|
+
upgradeHandler = (request, socket, head) => {
|
|
140
|
+
if (!upgradePathMatches(request, wsPathNormalized)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
wss.handleUpgrade(request, socket, head, (ws) => {
|
|
144
|
+
wss.emit('connection', ws, request);
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
options.httpServer.on('upgrade', upgradeHandler);
|
|
148
|
+
}
|
|
105
149
|
function acceptConnection(ws) {
|
|
106
150
|
clients.add(ws);
|
|
107
151
|
needsResync.delete(ws);
|
|
@@ -222,6 +266,10 @@ export async function createServer(view, options = {}) {
|
|
|
222
266
|
computeAndBroadcast();
|
|
223
267
|
},
|
|
224
268
|
close() {
|
|
269
|
+
if (options.httpServer != null && upgradeHandler != null) {
|
|
270
|
+
options.httpServer.off('upgrade', upgradeHandler);
|
|
271
|
+
upgradeHandler = null;
|
|
272
|
+
}
|
|
225
273
|
wss.close();
|
|
226
274
|
clients.clear();
|
|
227
275
|
needsResync.clear();
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geometra/server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Server-side layout engine with WebSocket geometry streaming",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"prepublishOnly": "npm run build"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@geometra/core": "^1.
|
|
37
|
+
"@geometra/core": "^1.2.0",
|
|
38
38
|
"ws": "^8.18.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|