@reactpy/client 0.1.0 → 0.2.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/src/mount.js DELETED
@@ -1,105 +0,0 @@
1
- import React from "react";
2
- import ReactDOM from "react-dom";
3
- import { Layout } from "./components.js";
4
-
5
- export function mountLayout(mountElement, layoutProps) {
6
- ReactDOM.render(React.createElement(Layout, layoutProps), mountElement);
7
- }
8
-
9
- export function mountLayoutWithWebSocket(
10
- element,
11
- endpoint,
12
- loadImportSource,
13
- maxReconnectTimeout
14
- ) {
15
- mountLayoutWithReconnectingWebSocket(
16
- element,
17
- endpoint,
18
- loadImportSource,
19
- maxReconnectTimeout
20
- );
21
- }
22
-
23
- function mountLayoutWithReconnectingWebSocket(
24
- element,
25
- endpoint,
26
- loadImportSource,
27
- maxReconnectTimeout,
28
- mountState = {
29
- everMounted: false,
30
- reconnectAttempts: 0,
31
- reconnectTimeoutRange: 0,
32
- }
33
- ) {
34
- const socket = new WebSocket(endpoint);
35
-
36
- const updateHookPromise = new LazyPromise();
37
-
38
- socket.onopen = (event) => {
39
- console.info(`ReactPy WebSocket connected.`);
40
-
41
- if (mountState.everMounted) {
42
- ReactDOM.unmountComponentAtNode(element);
43
- }
44
- _resetOpenMountState(mountState);
45
-
46
- mountLayout(element, {
47
- loadImportSource,
48
- saveUpdateHook: updateHookPromise.resolve,
49
- sendEvent: (event) => socket.send(JSON.stringify(event)),
50
- });
51
- };
52
-
53
- socket.onmessage = (event) => {
54
- const message = JSON.parse(event.data);
55
- updateHookPromise.promise.then((update) => update(message));
56
- };
57
-
58
- socket.onclose = (event) => {
59
- if (!maxReconnectTimeout) {
60
- console.info(`ReactPy WebSocket connection lost.`);
61
- return;
62
- }
63
-
64
- const reconnectTimeout = _nextReconnectTimeout(
65
- maxReconnectTimeout,
66
- mountState
67
- );
68
-
69
- console.info(
70
- `ReactPy WebSocket connection lost. Reconnecting in ${reconnectTimeout} seconds...`
71
- );
72
-
73
- setTimeout(function () {
74
- mountState.reconnectAttempts++;
75
- mountLayoutWithReconnectingWebSocket(
76
- element,
77
- endpoint,
78
- loadImportSource,
79
- maxReconnectTimeout,
80
- mountState
81
- );
82
- }, reconnectTimeout * 1000);
83
- };
84
- }
85
-
86
- function _resetOpenMountState(mountState) {
87
- mountState.everMounted = true;
88
- mountState.reconnectAttempts = 0;
89
- mountState.reconnectTimeoutRange = 0;
90
- }
91
-
92
- function _nextReconnectTimeout(maxReconnectTimeout, mountState) {
93
- const timeout =
94
- Math.floor(Math.random() * mountState.reconnectTimeoutRange) || 1;
95
- mountState.reconnectTimeoutRange =
96
- (mountState.reconnectTimeoutRange + 5) % maxReconnectTimeout;
97
- return timeout;
98
- }
99
-
100
- function LazyPromise() {
101
- this.promise = new Promise((resolve, reject) => {
102
- this.resolve = resolve;
103
- this.reject = reject;
104
- });
105
- }
package/src/server.js DELETED
@@ -1,46 +0,0 @@
1
- import React from "react";
2
- import ReactDOM from "react-dom";
3
- import { mountLayoutWithWebSocket } from "./mount.js";
4
-
5
- export function mountWithLayoutServer(
6
- element,
7
- serverInfo,
8
- maxReconnectTimeout
9
- ) {
10
- const loadImportSource = (source, sourceType) =>
11
- import(
12
- sourceType == "NAME" ? serverInfo.path.module(source) : source
13
- ).catch((error) => {
14
- // Added a catch to silence a build warning caller so we just re-throw.
15
- // The caller is actually responsible for catching this error.
16
- throw error;
17
- });
18
-
19
- mountLayoutWithWebSocket(
20
- element,
21
- serverInfo.path.stream,
22
- loadImportSource,
23
- maxReconnectTimeout
24
- );
25
- }
26
-
27
- export function LayoutServerInfo({ host, port, path, query, secure }) {
28
- const wsProtocol = `ws${secure ? "s" : ""}`;
29
- const wsBaseUrl = `${wsProtocol}://${host}:${port}`;
30
-
31
- let pathName = path || new URL(document.baseURI).pathname;
32
- if (pathName.endsWith("/")) {
33
- pathName = pathName.slice(0, -1);
34
- }
35
-
36
- if (query) {
37
- query = `?${query}`;
38
- } else {
39
- query = "";
40
- }
41
-
42
- this.path = {
43
- stream: `${wsBaseUrl}/_reactpy/stream${pathName}${query}`,
44
- module: (source) => `/_reactpy/modules/${source}`,
45
- };
46
- }