@reactpy/client 1.1.0 → 1.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,GAAG,EAET,MAAM,QAAQ,CAAC;AAEhB,OAAO,KAAK,EAGV,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAI9C,wBAAgB,MAAM,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAsBpE;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAoB7E"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,GAAG,EAET,MAAM,QAAQ,CAAC;AAShB,OAAO,KAAK,EAGV,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAmH9C,wBAAgB,MAAM,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAsBpE;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAoB7E"}
@@ -2,8 +2,105 @@ import { jsx as _jsx } from "preact/jsx-runtime";
2
2
  import { set as setJsonPointer } from "json-pointer";
3
3
  import { createContext, createElement, Fragment, } from "preact";
4
4
  import { useContext, useEffect, useRef, useState } from "preact/hooks";
5
+ import { HANDLER_DEBOUNCE, HANDLER_MARKER, HANDLER_THROTTLE, isValidDebounce, } from "./handler";
5
6
  import { createAttributes, createChildren, loadImportSource } from "./vdom";
6
7
  const ClientContext = createContext(null);
8
+ /**
9
+ * Wrap ``handler`` so its outgoing call is throttled to at most once per
10
+ * ``intervalMs`` milliseconds. Subsequent calls inside the window are
11
+ * collapsed and the trailing call (with the most recent arguments) fires
12
+ * once the window expires.
13
+ *
14
+ * Returns the original handler unchanged when ``intervalMs`` is missing or
15
+ * invalid.
16
+ */
17
+ function throttleHandler(handler, intervalMs) {
18
+ if (!isValidDebounce(intervalMs)) {
19
+ return handler;
20
+ }
21
+ let pendingArgs = null;
22
+ let timer = null;
23
+ let lastFireTime = 0;
24
+ const wrapped = function (...args) {
25
+ const now = Date.now();
26
+ const elapsed = now - lastFireTime;
27
+ if (elapsed >= intervalMs) {
28
+ // Leading edge: fire immediately, then start a cooldown.
29
+ lastFireTime = now;
30
+ handler(...args);
31
+ return;
32
+ }
33
+ // Trailing edge: remember the latest args and schedule a fire at the
34
+ // end of the cooldown so no event is silently dropped.
35
+ pendingArgs = args;
36
+ if (timer === null) {
37
+ timer = window.setTimeout(() => {
38
+ timer = null;
39
+ if (pendingArgs !== null) {
40
+ const callArgs = pendingArgs;
41
+ pendingArgs = null;
42
+ lastFireTime = Date.now();
43
+ handler(...callArgs);
44
+ }
45
+ }, Math.max(0, intervalMs - elapsed));
46
+ }
47
+ };
48
+ // Preserve the tag markers so downstream code can still introspect the
49
+ // wrapped function.
50
+ wrapped[HANDLER_MARKER] = true;
51
+ const debounce = handler[HANDLER_DEBOUNCE];
52
+ if (typeof debounce === "number") {
53
+ wrapped[HANDLER_DEBOUNCE] = debounce;
54
+ }
55
+ return wrapped;
56
+ }
57
+ /**
58
+ * Wrap ``handler`` so its outgoing call is debounced by
59
+ * ``delayMs`` milliseconds. The first call schedules a fire after
60
+ * the delay; subsequent calls inside the window reset the timer and
61
+ * pass their arguments to the trailing call. Only one call lands
62
+ * on the wrapped handler per debounce window.
63
+ *
64
+ * Returns the original handler unchanged when ``delayMs`` is missing
65
+ * or invalid, so callers can pass a 0 / negative value to opt out.
66
+ *
67
+ * Unlike ``throttleHandler`` (which fires on the leading edge),
68
+ * this strictly trailing-edge debounce is the right semantics for
69
+ * text inputs: the server only sees the final state after the user
70
+ * pauses typing, which is exactly when the reconcile can safely apply
71
+ * a server-side transformation (normalisation, validation, etc.).
72
+ */
73
+ function debounceHandler(handler, delayMs) {
74
+ if (!isValidDebounce(delayMs) || delayMs === 0) {
75
+ return handler;
76
+ }
77
+ let timer = null;
78
+ let pendingArgs = null;
79
+ const wrapped = function (...args) {
80
+ pendingArgs = args;
81
+ if (timer !== null) {
82
+ window.clearTimeout(timer);
83
+ }
84
+ timer = window.setTimeout(() => {
85
+ timer = null;
86
+ if (pendingArgs !== null) {
87
+ const callArgs = pendingArgs;
88
+ pendingArgs = null;
89
+ handler(...callArgs);
90
+ }
91
+ }, delayMs);
92
+ };
93
+ // Preserve the tag markers so downstream code can still introspect
94
+ // the wrapped function.
95
+ wrapped[HANDLER_MARKER] = true;
96
+ if (typeof handler[HANDLER_THROTTLE] === "number") {
97
+ wrapped[HANDLER_THROTTLE] = handler[HANDLER_THROTTLE];
98
+ }
99
+ if (typeof handler[HANDLER_DEBOUNCE] === "number") {
100
+ wrapped[HANDLER_DEBOUNCE] = handler[HANDLER_DEBOUNCE];
101
+ }
102
+ return wrapped;
103
+ }
7
104
  export function Layout(props) {
8
105
  const currentModel = useState({ tagName: "" })[0];
9
106
  const forceUpdate = useForceUpdate();
@@ -42,36 +139,207 @@ export function Element({ model }) {
42
139
  }
43
140
  function StandardElement({ model }) {
44
141
  const client = useContext(ClientContext);
142
+ const attrs = createAttributes(model, client);
143
+ // Apply the throttle wrapper to tagged handlers. ``throttle`` works on
144
+ // every element; ``debounce`` is intentionally only applied by
145
+ // ``UserInputElement`` (the only place where coalescing keystrokes
146
+ // is meaningful — click handlers don't benefit from trailing-edge
147
+ // coalescing, and applying debounce here would just delay
148
+ // non-input events for no reason).
149
+ for (const [name, prop] of Object.entries(attrs)) {
150
+ if (typeof prop !== "function") {
151
+ continue;
152
+ }
153
+ const handler = prop;
154
+ if (!handler[HANDLER_MARKER]) {
155
+ continue;
156
+ }
157
+ const throttle = handler[HANDLER_THROTTLE];
158
+ if (isValidDebounce(throttle)) {
159
+ attrs[name] = throttleHandler(handler, throttle);
160
+ }
161
+ }
45
162
  // Use createElement here to avoid warning about variable numbers of children not
46
163
  // having keys. Warning about this must now be the responsibility of the client
47
164
  // providing the models instead of the client rendering them.
48
- return createElement(model.tagName === "" ? Fragment : model.tagName, createAttributes(model, client), ...createChildren(model, (child) => {
165
+ return createElement(model.tagName === "" ? Fragment : model.tagName, attrs, ...createChildren(model, (child) => {
49
166
  return _jsx(Element, { model: child }, child.attributes?.key);
50
167
  }));
51
168
  }
52
169
  function UserInputElement({ model }) {
53
170
  const client = useContext(ClientContext);
54
171
  const props = createAttributes(model, client);
55
- const [value, setValue] = useState(props.value);
172
+ // ``_reactpy_ack_seq`` is set by the server to the highest sequence
173
+ // number it has received from this element's event handlers. We use
174
+ // it (instead of a time-based debounce) to decide whether the server
175
+ // has caught up to the user's keystrokes.
176
+ const serverAckSeq = typeof model.attributes?.["_reactpy_ack_seq"] === "number"
177
+ ? model.attributes["_reactpy_ack_seq"]
178
+ : -1;
179
+ // Strip the internal key from props so it never reaches the DOM.
180
+ delete props["_reactpy_ack_seq"];
181
+ const [, setValue] = useState(props.value);
182
+ // Reference to the underlying DOM element. We read its current
183
+ // ``value`` from the reconcile effect to compare against the
184
+ // server's proposed value — reading from Preact state is not
185
+ // enough because the browser mutates the DOM directly between
186
+ // renders (especially during fast typing).
187
+ const inputRef = useRef(null);
188
+ // Per-element (NOT per-handler) monotonic counter for outgoing
189
+ // events. The wrapper below installs this counter onto every
190
+ // handler via ``_reactpy_set_seq`` so the counter survives
191
+ // handler recreation on every server re-render. Each handler
192
+ // has its own per-handler ``outgoingSeq`` (used as the default
193
+ // when no wrapper is installed), but we override it here so the
194
+ // element owns a single monotonic counter across handlers.
195
+ const sharedOutgoingSeq = useRef(0);
196
+ // Highest sequence number actually sent. The server's
197
+ // ``_reactpy_ack_seq`` will catch up to this. ``sharedOutgoingSeq``
198
+ // is incremented optimistically in the wrapper; ``lastSentSeq``
199
+ // is the high-water mark.
200
+ const lastSentSeq = useRef(-1);
56
201
  // honor changes to value from the client via props
57
- useEffect(() => setValue(props.value), [props.value]);
58
- const givenOnChange = props.onChange;
59
- if (typeof givenOnChange === "function") {
60
- props.onChange = (event) => {
61
- // immediately update the value to give the user feedback
62
- if (event.target) {
63
- setValue(event.target.value);
202
+ useEffect(() => {
203
+ // The sequence number is the single source of truth for whether
204
+ // to apply the server's value. Time-based heuristics (debounce
205
+ // windows, submit-event detection) are not used here because they
206
+ // cannot reliably distinguish a server snapshot from before some
207
+ // keystrokes were processed from a snapshot taken after all
208
+ // keystrokes were processed. The sequence number can,
209
+ // deterministically.
210
+ //
211
+ // If the server has acknowledged every event the user has sent
212
+ // (``serverAckSeq >= lastSentSeq.current``), the server's value
213
+ // is the authoritative one and is applied directly. This
214
+ // includes clears (Enter handlers that reset the input),
215
+ // normalizations, and same-value confirmations.
216
+ // If the server is behind, its value is necessarily a stale
217
+ // snapshot and is ignored; the next layout-update will be
218
+ // applied once the server catches up.
219
+ //
220
+ // We additionally compare against the DOM's actual current
221
+ // value via ``inputRef`` — when the server is supposedly
222
+ // caught up but its snapshot is shorter than what the user
223
+ // has in the DOM (a stale snapshot racing with the user's
224
+ // most recent keystroke), skip applying so we don't clobber
225
+ // the user's text. This handles the realistic case where the
226
+ // user types faster than the server can ack.
227
+ if (serverAckSeq < lastSentSeq.current) {
228
+ return;
229
+ }
230
+ // Apply server's value to the DOM directly via the ref, NOT
231
+ // through Preact's render path. Preact would otherwise set
232
+ // ``inputRef.current.value`` on every render, racing with the
233
+ // browser's own mutations of the DOM value during fast typing
234
+ // and silently dropping keystrokes. By using a ref and writing
235
+ // only when we know the server has caught up, we let the
236
+ // browser manage the DOM value during typing and only override
237
+ // it when it's safe to do so.
238
+ //
239
+ // Crucially, only write when ``props.value`` is a real string.
240
+ // Inputs without a ``value`` attribute in their VDOM (e.g.
241
+ // uncontrolled inputs in the user_data and channel_layer tests)
242
+ // arrive with ``props.value === undefined``; assigning
243
+ // ``input.value = undefined`` coerces to the literal string
244
+ // ``"undefined"`` and seeds the field with garbage that the
245
+ // user's first keystroke will then append to (``test`` becomes
246
+ // ``testundefined``). Skipping the write in that case leaves
247
+ // the DOM at its default empty value, which is what the user
248
+ // actually typed into.
249
+ if (inputRef.current &&
250
+ typeof inputRef.current.value === "string" &&
251
+ typeof props.value === "string" &&
252
+ inputRef.current.value !== props.value) {
253
+ inputRef.current.value = props.value;
254
+ }
255
+ setValue(props.value);
256
+ }, [props.value, serverAckSeq]);
257
+ for (const [name, prop] of Object.entries(props)) {
258
+ if (typeof prop !== "function") {
259
+ continue;
260
+ }
261
+ const givenHandler = prop;
262
+ if (!givenHandler[HANDLER_MARKER]) {
263
+ continue;
264
+ }
265
+ // Apply ``throttle`` and/or ``debounce`` wrappers when the
266
+ // handler opts into them. Throttle fires on the leading edge
267
+ // (good for click-style events); debounce fires on the
268
+ // trailing edge (good for typing, where you want the server
269
+ // to see only the final state after the user pauses). Both
270
+ // are no-ops when the corresponding keyword is absent, which
271
+ // is the common case — the per-element seq reconcile is
272
+ // already responsible for input coherency, so we don't apply
273
+ // a debounce by default.
274
+ const handlerDebounce = givenHandler[HANDLER_DEBOUNCE];
275
+ const handlerThrottle = givenHandler[HANDLER_THROTTLE];
276
+ let wrapped = givenHandler;
277
+ if (isValidDebounce(handlerThrottle)) {
278
+ wrapped = throttleHandler(wrapped, handlerThrottle);
279
+ }
280
+ if (isValidDebounce(handlerDebounce)) {
281
+ wrapped = debounceHandler(wrapped, handlerDebounce);
282
+ }
283
+ props[name] = (event) => {
284
+ // Use a per-element (shared across all handlers on this
285
+ // element) monotonic counter for outgoing events. We
286
+ // overwrite the handler's own ``outgoingSeq`` with this
287
+ // counter so the wire-format seq number reflects the
288
+ // element-wide sequence. The handler closure's own
289
+ // ``outgoingSeq`` is unused for sequencing purposes now
290
+ // (it still exists as a default for non-wrapped callers).
291
+ //
292
+ // Critically, we increment the seq counter and update
293
+ // ``lastSentSeq`` on every *user* event, not on every
294
+ // server dispatch. If the handler is wrapped in a
295
+ // debounce that coalesces several events into one server
296
+ // dispatch, ``lastSentSeq`` will be higher than the seq
297
+ // actually sent to the server, which is fine — the seq
298
+ // we sent is the LATEST user-typed value, which is the
299
+ // one the server actually processed.
300
+ const seq = sharedOutgoingSeq.current++;
301
+ if (seq > lastSentSeq.current) {
302
+ lastSentSeq.current = seq;
64
303
  }
65
- // allow the client to respond (and possibly change the value)
66
- givenOnChange(event);
304
+ const taggedHandler = givenHandler;
305
+ if (typeof taggedHandler._reactpy_set_seq === "function") {
306
+ // Push the handler's internal counter past our seq so
307
+ // the next (possibly debounced) dispatch uses a seq
308
+ // number that matches what the user just typed, not
309
+ // whatever stale value the handler closure happened
310
+ // to have left over.
311
+ taggedHandler._reactpy_set_seq(seq + 1);
312
+ }
313
+ // ``onKeyPress`` fires before the DOM has been updated with
314
+ // the new keystroke — ``event.target.value`` is the value
315
+ // BEFORE the character was added. We deliberately do NOT
316
+ // trust it for value-tracking. ``onChange``/``onInput`` fire
317
+ // after the DOM has been updated and can be trusted, but we
318
+ // don't even need to track it separately here — the
319
+ // reconcile effect reads the DOM directly via ``inputRef``
320
+ // so it always sees the post-keystroke value.
321
+ wrapped(event);
67
322
  };
68
323
  }
69
324
  // Use createElement here to avoid warning about variable numbers of children not
70
325
  // having keys. Warning about this must now be the responsibility of the client
71
326
  // providing the models instead of the client rendering them.
72
- return createElement(model.tagName,
73
- // overwrite
74
- { ...props, value }, ...createChildren(model, (child) => (_jsx(Element, { model: child }, child.attributes?.key))));
327
+ // Drop ``value`` from the props we pass to Preact — we want the
328
+ // input to be fully uncontrolled. Preact would otherwise set
329
+ // ``inputRef.current.value`` on every render (because ``value``
330
+ // is a known DOM property), racing with the browser's own
331
+ // mutations of the DOM value during fast typing and silently
332
+ // dropping keystrokes. We instead update the DOM value via the
333
+ // ``inputRef`` in the reconcile effect above, only when the
334
+ // server has caught up and the proposed value is not shorter
335
+ // than what the user has already typed.
336
+ const controlledProps = {};
337
+ for (const key of Object.keys(props)) {
338
+ if (key !== "value") {
339
+ controlledProps[key] = props[key];
340
+ }
341
+ }
342
+ return createElement(model.tagName, { ...controlledProps, ref: inputRef }, ...createChildren(model, (child) => (_jsx(Element, { model: child }, child.attributes?.key))));
75
343
  }
76
344
  function ScriptElement({ model }) {
77
345
  const ref = useRef(null);
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare const HANDLER_MARKER: "isHandler";
2
+ export declare const HANDLER_DEBOUNCE: "debounce";
3
+ export declare const HANDLER_THROTTLE: "throttle";
4
+ export type HandlerMarker = typeof HANDLER_MARKER;
5
+ export type HandlerDebounce = typeof HANDLER_DEBOUNCE;
6
+ export type HandlerThrottle = typeof HANDLER_THROTTLE;
7
+ export type TaggedEventHandler = ((event: Event) => void) & {
8
+ [HANDLER_MARKER]: true;
9
+ [HANDLER_DEBOUNCE]?: number;
10
+ [HANDLER_THROTTLE]?: number;
11
+ };
12
+ /**
13
+ * Returns true when the given value is a finite, non-negative integer.
14
+ * Used to validate debounce/throttle values arriving over the wire from the
15
+ * Python layout.
16
+ */
17
+ export declare function isValidDebounce(value: unknown): value is number;
18
+ export declare const isValidThrottle: typeof isValidDebounce;
19
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,EAAG,WAAoB,CAAC;AACnD,eAAO,MAAM,gBAAgB,EAAG,UAAmB,CAAC;AACpD,eAAO,MAAM,gBAAgB,EAAG,UAAmB,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC;AAClD,MAAM,MAAM,eAAe,GAAG,OAAO,gBAAgB,CAAC;AACtD,MAAM,MAAM,eAAe,GAAG,OAAO,gBAAgB,CAAC;AAEtD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG;IAC1D,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC;IACvB,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAO/D;AAED,eAAO,MAAM,eAAe,wBAAkB,CAAC"}
@@ -0,0 +1,19 @@
1
+ // Shared marker property names attached to event handler functions created by
2
+ // `vdom.tsx::createEventHandler`. Centralizing these strings keeps `components.tsx`
3
+ // and `vdom.tsx` in sync without relying on ad-hoc property names.
4
+ export const HANDLER_MARKER = "isHandler";
5
+ export const HANDLER_DEBOUNCE = "debounce";
6
+ export const HANDLER_THROTTLE = "throttle";
7
+ /**
8
+ * Returns true when the given value is a finite, non-negative integer.
9
+ * Used to validate debounce/throttle values arriving over the wire from the
10
+ * Python layout.
11
+ */
12
+ export function isValidDebounce(value) {
13
+ return (typeof value === "number" &&
14
+ Number.isFinite(value) &&
15
+ Number.isInteger(value) &&
16
+ value >= 0);
17
+ }
18
+ export const isValidThrottle = isValidDebounce;
19
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,oFAAoF;AACpF,mEAAmE;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,WAAoB,CAAC;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAmB,CAAC;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAmB,CAAC;AAYpD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACtB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QACvB,KAAK,IAAI,CAAC,CACX,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from "./client";
2
2
  export * from "./components";
3
+ export * from "./handler";
3
4
  export * from "./mount";
4
5
  export * from "./types";
5
6
  export * from "./vdom";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from "./client";
2
2
  export * from "./components";
3
+ export * from "./handler";
3
4
  export * from "./mount";
4
5
  export * from "./types";
5
6
  export * from "./vdom";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,QAkC7C"}
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,QA+B7C"}
package/dist/mount.js CHANGED
@@ -8,9 +8,9 @@ export function mountReactPy(props) {
8
8
  const wsOrigin = `${wsProtocol}//${window.location.host}`;
9
9
  const componentUrl = new URL(`${wsOrigin}${props.pathPrefix}${props.componentPath || ""}`);
10
10
  // Embed the initial HTTP path into the WebSocket URL
11
- componentUrl.searchParams.append("http_pathname", window.location.pathname);
11
+ componentUrl.searchParams.append("path", window.location.pathname);
12
12
  if (window.location.search) {
13
- componentUrl.searchParams.append("http_query_string", window.location.search);
13
+ componentUrl.searchParams.append("qs", window.location.search);
14
14
  }
15
15
  // Configure a new ReactPy client
16
16
  const client = new ReactPyClient({
package/dist/mount.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,0CAA0C;IAC1C,MAAM,UAAU,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAC5E,MAAM,QAAQ,GAAG,GAAG,UAAU,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,GAAG,QAAQ,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,CAC7D,CAAC;IAEF,qDAAqD;IACrD,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,YAAY,CAAC,YAAY,CAAC,MAAM,CAC9B,mBAAmB,EACnB,MAAM,CAAC,QAAQ,CAAC,MAAM,CACvB,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;QAC/B,IAAI,EAAE;YACJ,YAAY,EAAE,YAAY;YAC1B,aAAa,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,UAAU;SACtE;QACD,gBAAgB,EAAE;YAChB,QAAQ,EAAE,KAAK,CAAC,iBAAiB,IAAI,GAAG;YACxC,WAAW,EAAE,KAAK,CAAC,oBAAoB,IAAI,KAAK;YAChD,UAAU,EAAE,KAAK,CAAC,mBAAmB,IAAI,GAAG;YAC5C,iBAAiB,EAAE,KAAK,CAAC,0BAA0B,IAAI,IAAI;SAC5D;QACD,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,CAAC,KAAC,MAAM,IAAC,MAAM,EAAE,MAAM,GAAI,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,0CAA0C;IAC1C,MAAM,UAAU,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAC5E,MAAM,QAAQ,GAAG,GAAG,UAAU,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,GAAG,QAAQ,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,CAC7D,CAAC;IAEF,qDAAqD;IACrD,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,iCAAiC;IACjC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;QAC/B,IAAI,EAAE;YACJ,YAAY,EAAE,YAAY;YAC1B,aAAa,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,UAAU;SACtE;QACD,gBAAgB,EAAE;YAChB,QAAQ,EAAE,KAAK,CAAC,iBAAiB,IAAI,GAAG;YACxC,WAAW,EAAE,KAAK,CAAC,oBAAoB,IAAI,KAAK;YAChD,UAAU,EAAE,KAAK,CAAC,mBAAmB,IAAI,GAAG;YAC5C,iBAAiB,EAAE,KAAK,CAAC,0BAA0B,IAAI,IAAI;SAC5D;QACD,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,CAAC,KAAC,MAAM,IAAC,MAAM,EAAE,MAAM,GAAI,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;AACzD,CAAC"}
package/dist/types.d.ts CHANGED
@@ -40,7 +40,7 @@ export type ReactPyComponent = ComponentType<{
40
40
  export type ReactPyVdom = {
41
41
  tagName: string;
42
42
  attributes?: {
43
- [key: string]: string;
43
+ [key: string]: any;
44
44
  };
45
45
  children?: (ReactPyVdom | string)[];
46
46
  error?: string;
@@ -56,6 +56,8 @@ export type ReactPyVdomEventHandler = {
56
56
  target: string;
57
57
  preventDefault?: boolean;
58
58
  stopPropagation?: boolean;
59
+ debounce?: number;
60
+ throttle?: number;
59
61
  };
60
62
  export type ReactPyVdomImportSource = {
61
63
  source: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/vdom.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { ReactPyVdom, ReactPyVdomImportSource, BindImportSource } from "./types";
2
1
  import type { ReactPyClient } from "./client";
2
+ import type { BindImportSource, ReactPyVdom, ReactPyVdomImportSource } from "./types";
3
3
  export declare function loadImportSource(vdomImportSource: ReactPyVdomImportSource, client: ReactPyClient): Promise<BindImportSource>;
4
4
  export declare function createChildren<Child>(model: ReactPyVdom, createChild: (child: ReactPyVdom) => Child): (Child | string)[];
5
5
  export declare function createAttributes(model: ReactPyVdom, client: ReactPyClient): {
@@ -1 +1 @@
1
- {"version":3,"file":"vdom.d.ts","sourceRoot":"","sources":["../src/vdom.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EAGvB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,gBAAgB,CAAC,CA2C3B;AAsGD,wBAAgB,cAAc,CAAC,KAAK,EAClC,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,KAAK,GACzC,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAapB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,aAAa,GACpB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAmBxB"}
1
+ {"version":3,"file":"vdom.d.ts","sourceRoot":"","sources":["../src/vdom.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EACV,gBAAgB,EAIhB,WAAW,EAEX,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAEjB,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,gBAAgB,CAAC,CA2C3B;AAsGD,wBAAgB,cAAc,CAAC,KAAK,EAClC,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,KAAK,GACzC,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAapB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,aAAa,GACpB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAmBxB"}
package/dist/vdom.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import eventToObject from "event-to-object";
2
2
  import { Fragment } from "preact";
3
+ import { HANDLER_DEBOUNCE, HANDLER_MARKER, HANDLER_THROTTLE, isValidDebounce, isValidThrottle, } from "./handler";
3
4
  import { infer_bind_from_environment } from "./bind";
4
5
  import log from "./logger";
5
6
  export async function loadImportSource(vdomImportSource, client) {
@@ -129,7 +130,15 @@ export function createAttributes(model, client) {
129
130
  ...Object.fromEntries(Object.entries(model.inlineJavaScript || {}).map(([name, inlineJavaScript]) => createInlineJavaScript(name, inlineJavaScript))),
130
131
  }));
131
132
  }
132
- function createEventHandler(client, name, { target, preventDefault, stopPropagation }) {
133
+ function createEventHandler(client, name, { target, preventDefault, stopPropagation, debounce, throttle, }) {
134
+ // Sequence number for the next outgoing event on this handler.
135
+ // The wrapper in ``UserInputElement`` may overwrite this before
136
+ // the event is actually sent (so that the wrapper, not this
137
+ // closure, owns the per-element monotonic counter and survives
138
+ // handler recreation on every server re-render). The default
139
+ // behavior (no wrapper) is to use a per-handler counter starting
140
+ // at 0.
141
+ let outgoingSeq = 0;
133
142
  const eventHandler = function (...args) {
134
143
  const data = Array.from(args).map((value) => {
135
144
  const event = value;
@@ -147,9 +156,32 @@ function createEventHandler(client, name, { target, preventDefault, stopPropagat
147
156
  return event;
148
157
  }
149
158
  });
150
- client.sendMessage({ type: "layout-event", data, target });
159
+ const seq = outgoingSeq++;
160
+ client.sendMessage({ type: "layout-event", data, target, seq });
151
161
  };
152
- eventHandler.isHandler = true;
162
+ eventHandler[HANDLER_MARKER] = true;
163
+ eventHandler._reactpy_peek_seq = () => outgoingSeq;
164
+ eventHandler._reactpy_set_seq = (n) => {
165
+ outgoingSeq = n;
166
+ };
167
+ if (debounce !== undefined) {
168
+ if (!isValidDebounce(debounce)) {
169
+ log.warn(`Ignoring invalid debounce value ${JSON.stringify(debounce)} ` +
170
+ `on event handler "${name}": expected a non-negative integer.`);
171
+ }
172
+ else {
173
+ eventHandler[HANDLER_DEBOUNCE] = debounce;
174
+ }
175
+ }
176
+ if (throttle !== undefined) {
177
+ if (!isValidThrottle(throttle)) {
178
+ log.warn(`Ignoring invalid throttle value ${JSON.stringify(throttle)} ` +
179
+ `on event handler "${name}": expected a non-negative integer.`);
180
+ }
181
+ else {
182
+ eventHandler[HANDLER_THROTTLE] = throttle;
183
+ }
184
+ }
153
185
  return [name, eventHandler];
154
186
  }
155
187
  function createInlineJavaScript(name, inlineJavaScript) {