@geometra/client 0.2.0 → 0.3.1

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 ADDED
@@ -0,0 +1,34 @@
1
+ # @geometra/client
2
+
3
+ Thin WebSocket client (~2KB) for Geometra. Connects to a Geometra server and renders streamed layouts on a canvas.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @geometra/client
9
+ ```
10
+
11
+ ## Key Export
12
+
13
+ - `createClient` -- creates a WebSocket client that connects to a Geometra server
14
+
15
+ ## Usage
16
+
17
+ ```ts
18
+ import { createClient } from '@geometra/client'
19
+ import { CanvasRenderer } from '@geometra/renderer-canvas'
20
+
21
+ const canvas = document.getElementById('app') as HTMLCanvasElement
22
+ const client = createClient({
23
+ url: 'ws://localhost:3000',
24
+ renderer: new CanvasRenderer({ canvas }),
25
+ canvas,
26
+ // forwards pointer + keyboard + IME composition events to server
27
+ forwardKeyboard: true,
28
+ forwardComposition: true,
29
+ })
30
+ ```
31
+
32
+ ## Links
33
+
34
+ - [Main repo](https://github.com/AiGeekz/geometra)
package/dist/client.d.ts CHANGED
@@ -7,20 +7,35 @@ export interface TexturaClientOptions {
7
7
  renderer: Renderer;
8
8
  /** Optional canvas element for forwarding pointer events. */
9
9
  canvas?: HTMLCanvasElement;
10
+ /** Capture keyboard on canvas/document and forward to server. Default: true when canvas provided. */
11
+ forwardKeyboard?: boolean;
12
+ /** Capture IME composition events and forward to server. Default: true when canvas provided. */
13
+ forwardComposition?: boolean;
14
+ /** Keyboard event target. Default: canvas, else document. */
15
+ keyboardTarget?: HTMLElement | Document;
16
+ /** Forward resize events to server. Default: true when canvas provided. */
17
+ forwardResize?: boolean;
18
+ /** Resize event target. Default: window. */
19
+ resizeTarget?: Window;
20
+ /** Called on WebSocket or message parsing errors. */
21
+ onError?: (error: unknown) => void;
22
+ /** Enable automatic reconnection on disconnect. Default: true. */
23
+ reconnect?: boolean;
10
24
  }
11
25
  export interface TexturaClient {
12
26
  /** Current layout (if received). */
13
27
  layout: ComputedLayout | null;
14
28
  /** Current tree (if received). */
15
29
  tree: UIElement | null;
16
- /** Disconnect from server. */
30
+ /** Disconnect from server (no reconnect). */
17
31
  close(): void;
18
32
  }
19
33
  /**
20
- * Connect to a Textura server and render received geometry.
34
+ * Connect to a Geometra server and render received geometry.
21
35
  *
22
36
  * The client is a thin paint layer — all layout computation happens server-side.
23
37
  * Pointer events on the canvas are forwarded to the server for hit-testing.
38
+ * Automatically reconnects on disconnect with exponential backoff.
24
39
  */
25
40
  export declare function createClient(options: TexturaClientOptions): TexturaClient;
26
41
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAqBzD,MAAM,WAAW,oBAAoB;IACnC,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,QAAQ,EAAE,QAAQ,CAAA;IAClB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;IAC7B,kCAAkC;IAClC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,8BAA8B;IAC9B,KAAK,IAAI,IAAI,CAAA;CACd;AAqBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAoEzE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AA+BzD,MAAM,WAAW,oBAAoB;IACnC,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,QAAQ,EAAE,QAAQ,CAAA;IAClB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,qGAAqG;IACrG,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,gGAAgG;IAChG,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;IACvC,2EAA2E;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qDAAqD;IACrD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;IAC7B,kCAAkC;IAClC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,6CAA6C;IAC7C,KAAK,IAAI,IAAI,CAAA;CACd;AAiBD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAiMzE"}
package/dist/client.js CHANGED
@@ -1,4 +1,4 @@
1
- /** Apply patches to a computed layout tree (mutates in place). */
1
+ const PROTOCOL_VERSION = 1;
2
2
  function applyPatches(layout, patches) {
3
3
  for (const patch of patches) {
4
4
  let node = layout;
@@ -19,45 +19,123 @@ function applyPatches(layout, patches) {
19
19
  }
20
20
  }
21
21
  /**
22
- * Connect to a Textura server and render received geometry.
22
+ * Connect to a Geometra server and render received geometry.
23
23
  *
24
24
  * The client is a thin paint layer — all layout computation happens server-side.
25
25
  * Pointer events on the canvas are forwarded to the server for hit-testing.
26
+ * Automatically reconnects on disconnect with exponential backoff.
26
27
  */
27
28
  export function createClient(options) {
28
29
  const url = options.url ?? 'ws://localhost:3100';
29
- const { renderer, canvas } = options;
30
+ const { renderer, canvas, onError } = options;
31
+ const shouldReconnect = options.reconnect !== false;
32
+ let ws;
33
+ let closed = false;
34
+ let retryCount = 0;
35
+ let retryTimer = null;
36
+ const handlers = [];
30
37
  const state = {
31
38
  layout: null,
32
39
  tree: null,
33
40
  close() {
41
+ closed = true;
42
+ if (retryTimer)
43
+ clearTimeout(retryTimer);
34
44
  ws.close();
35
45
  cleanup();
36
46
  },
37
47
  };
38
- const ws = new WebSocket(url);
39
- ws.addEventListener('message', (event) => {
40
- const msg = JSON.parse(String(event.data));
41
- if (msg.type === 'frame') {
42
- state.layout = msg.layout;
43
- state.tree = msg.tree;
44
- renderer.render(msg.layout, msg.tree);
45
- }
46
- else if (msg.type === 'patch' && state.layout && state.tree) {
47
- applyPatches(state.layout, msg.patches);
48
- renderer.render(state.layout, state.tree);
49
- }
50
- });
51
- // Forward pointer events to server
48
+ function connect() {
49
+ ws = new WebSocket(url);
50
+ ws.addEventListener('open', () => {
51
+ retryCount = 0;
52
+ if (canvas && (options.forwardResize ?? true)) {
53
+ ws.send(JSON.stringify({
54
+ type: 'resize',
55
+ width: Math.max(1, Math.round(canvas.clientWidth || canvas.width)),
56
+ height: Math.max(1, Math.round(canvas.clientHeight || canvas.height)),
57
+ protocolVersion: PROTOCOL_VERSION,
58
+ }));
59
+ }
60
+ });
61
+ ws.addEventListener('message', (event) => {
62
+ try {
63
+ const msg = JSON.parse(String(event.data));
64
+ if (msg.protocolVersion && msg.protocolVersion > PROTOCOL_VERSION) {
65
+ onError?.(new Error(`Server protocol ${msg.protocolVersion} is newer than client protocol ${PROTOCOL_VERSION}`));
66
+ return;
67
+ }
68
+ if (msg.type === 'frame') {
69
+ state.layout = msg.layout;
70
+ state.tree = msg.tree;
71
+ renderer.render(msg.layout, msg.tree);
72
+ }
73
+ else if (msg.type === 'patch' && state.layout && state.tree) {
74
+ applyPatches(state.layout, msg.patches);
75
+ renderer.render(state.layout, state.tree);
76
+ }
77
+ else if (msg.type === 'error') {
78
+ onError?.(new Error(msg.message));
79
+ }
80
+ }
81
+ catch (err) {
82
+ onError?.(err);
83
+ }
84
+ });
85
+ ws.addEventListener('error', (event) => {
86
+ onError?.(event);
87
+ });
88
+ ws.addEventListener('close', () => {
89
+ if (!closed && shouldReconnect) {
90
+ const delay = Math.min(1000 * Math.pow(2, retryCount), 30000);
91
+ retryCount++;
92
+ retryTimer = setTimeout(connect, delay);
93
+ }
94
+ });
95
+ }
52
96
  const sendEvent = (eventType, e) => {
53
97
  if (ws.readyState !== WebSocket.OPEN)
54
98
  return;
55
99
  const rect = canvas?.getBoundingClientRect();
56
100
  const x = rect ? e.clientX - rect.left : e.clientX;
57
101
  const y = rect ? e.clientY - rect.top : e.clientY;
58
- ws.send(JSON.stringify({ type: 'event', eventType, x, y }));
102
+ ws.send(JSON.stringify({ type: 'event', eventType, x, y, protocolVersion: PROTOCOL_VERSION }));
103
+ };
104
+ const sendKeyEvent = (eventType, e) => {
105
+ if (ws.readyState !== WebSocket.OPEN)
106
+ return;
107
+ ws.send(JSON.stringify({
108
+ type: 'key',
109
+ eventType,
110
+ key: e.key,
111
+ code: e.code,
112
+ shiftKey: e.shiftKey,
113
+ ctrlKey: e.ctrlKey,
114
+ metaKey: e.metaKey,
115
+ altKey: e.altKey,
116
+ protocolVersion: PROTOCOL_VERSION,
117
+ }));
118
+ };
119
+ const sendCompositionEvent = (eventType, e) => {
120
+ if (ws.readyState !== WebSocket.OPEN)
121
+ return;
122
+ ws.send(JSON.stringify({
123
+ type: 'composition',
124
+ eventType,
125
+ data: e.data ?? '',
126
+ protocolVersion: PROTOCOL_VERSION,
127
+ }));
128
+ };
129
+ const sendResize = () => {
130
+ if (!canvas || ws.readyState !== WebSocket.OPEN)
131
+ return;
132
+ ws.send(JSON.stringify({
133
+ type: 'resize',
134
+ width: Math.max(1, Math.round(canvas.clientWidth || canvas.width)),
135
+ height: Math.max(1, Math.round(canvas.clientHeight || canvas.height)),
136
+ protocolVersion: PROTOCOL_VERSION,
137
+ }));
59
138
  };
60
- const handlers = [];
61
139
  if (canvas) {
62
140
  const onClick = (e) => sendEvent('onClick', e);
63
141
  const onPointerDown = (e) => sendEvent('onPointerDown', e);
@@ -67,16 +145,47 @@ export function createClient(options) {
67
145
  canvas.addEventListener('pointerdown', onPointerDown);
68
146
  canvas.addEventListener('pointerup', onPointerUp);
69
147
  canvas.addEventListener('pointermove', onPointerMove);
70
- handlers.push(['click', onClick], ['pointerdown', onPointerDown], ['pointerup', onPointerUp], ['pointermove', onPointerMove]);
148
+ handlers.push([canvas, 'click', onClick], [canvas, 'pointerdown', onPointerDown], [canvas, 'pointerup', onPointerUp], [canvas, 'pointermove', onPointerMove]);
149
+ }
150
+ const forwardKeyboard = options.forwardKeyboard ?? !!canvas;
151
+ const keyboardTarget = options.keyboardTarget ?? canvas ?? document;
152
+ if (forwardKeyboard) {
153
+ if (keyboardTarget instanceof HTMLElement && !keyboardTarget.hasAttribute('tabindex')) {
154
+ keyboardTarget.setAttribute('tabindex', '0');
155
+ }
156
+ const onKeyDown = (e) => sendKeyEvent('onKeyDown', e);
157
+ const onKeyUp = (e) => sendKeyEvent('onKeyUp', e);
158
+ keyboardTarget.addEventListener('keydown', onKeyDown);
159
+ keyboardTarget.addEventListener('keyup', onKeyUp);
160
+ handlers.push([keyboardTarget, 'keydown', onKeyDown], [keyboardTarget, 'keyup', onKeyUp]);
161
+ }
162
+ const forwardComposition = options.forwardComposition ?? !!canvas;
163
+ if (forwardComposition) {
164
+ if (keyboardTarget instanceof HTMLElement && !keyboardTarget.hasAttribute('tabindex')) {
165
+ keyboardTarget.setAttribute('tabindex', '0');
166
+ }
167
+ const onCompositionStart = (e) => sendCompositionEvent('onCompositionStart', e);
168
+ const onCompositionUpdate = (e) => sendCompositionEvent('onCompositionUpdate', e);
169
+ const onCompositionEnd = (e) => sendCompositionEvent('onCompositionEnd', e);
170
+ keyboardTarget.addEventListener('compositionstart', onCompositionStart);
171
+ keyboardTarget.addEventListener('compositionupdate', onCompositionUpdate);
172
+ keyboardTarget.addEventListener('compositionend', onCompositionEnd);
173
+ handlers.push([keyboardTarget, 'compositionstart', onCompositionStart], [keyboardTarget, 'compositionupdate', onCompositionUpdate], [keyboardTarget, 'compositionend', onCompositionEnd]);
174
+ }
175
+ const forwardResize = options.forwardResize ?? !!canvas;
176
+ if (forwardResize && canvas) {
177
+ const target = options.resizeTarget ?? window;
178
+ const onResize = () => sendResize();
179
+ target.addEventListener('resize', onResize);
180
+ handlers.push([target, 'resize', onResize]);
71
181
  }
72
182
  function cleanup() {
73
- if (canvas) {
74
- for (const [event, handler] of handlers) {
75
- canvas.removeEventListener(event, handler);
76
- }
183
+ for (const [target, event, handler] of handlers) {
184
+ target.removeEventListener(event, handler);
77
185
  }
78
186
  renderer.destroy();
79
187
  }
188
+ connect();
80
189
  return state;
81
190
  }
82
191
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geometra/client",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Thin client that receives server-computed geometry and paints via renderer",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -33,6 +33,6 @@
33
33
  "check": "tsc --noEmit"
34
34
  },
35
35
  "dependencies": {
36
- "@geometra/core": "^0.2.0"
36
+ "@geometra/core": "^0.3.1"
37
37
  }
38
38
  }