@schlessera/brain-ui-react 0.14.0 → 0.16.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 +25 -0
- package/dist/components/chat/brain-markdown.js +2 -2
- package/dist/components/chat/brain-markdown.js.map +1 -1
- package/dist/components/chat/chat-page.d.ts.map +1 -1
- package/dist/components/chat/chat-page.js +4 -0
- package/dist/components/chat/chat-page.js.map +1 -1
- package/dist/components/files/file-viewer-binary.js +2 -2
- package/dist/components/files/file-viewer-binary.js.map +1 -1
- package/dist/components/files/file-viewer.js +2 -2
- package/dist/components/files/file-viewer.js.map +1 -1
- package/dist/components/graph/graph-page.js +3 -3
- package/dist/components/graph/graph-page.js.map +1 -1
- package/dist/components/images/mask-editor.js +2 -2
- package/dist/components/images/mask-editor.js.map +1 -1
- package/dist/config.d.ts +37 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -1
- package/dist/hooks/use-websocket.d.ts +2 -2
- package/dist/hooks/use-websocket.d.ts.map +1 -1
- package/dist/hooks/use-websocket.js +49 -5
- package/dist/hooks/use-websocket.js.map +1 -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/lib/api-client.js +2 -2
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/backend.d.ts +3 -3
- package/dist/lib/backend.d.ts.map +1 -1
- package/dist/lib/backend.js +16 -15
- package/dist/lib/backend.js.map +1 -1
- package/dist/lib/share-intake.js +2 -2
- package/dist/lib/share-intake.js.map +1 -1
- package/dist/lib/share.js +2 -2
- package/dist/lib/share.js.map +1 -1
- package/dist/stores/chat-store.d.ts +13 -0
- package/dist/stores/chat-store.d.ts.map +1 -1
- package/dist/stores/chat-store.js +36 -8
- package/dist/stores/chat-store.js.map +1 -1
- package/dist/stores/connection-store.d.ts +18 -0
- package/dist/stores/connection-store.d.ts.map +1 -1
- package/dist/stores/connection-store.js +3 -0
- package/dist/stores/connection-store.js.map +1 -1
- package/dist/stores/file-store.d.ts.map +1 -1
- package/dist/stores/file-store.js +15 -5
- package/dist/stores/file-store.js.map +1 -1
- package/dist/stores/graph-store.d.ts.map +1 -1
- package/dist/stores/graph-store.js +8 -7
- package/dist/stores/graph-store.js.map +1 -1
- package/package.json +2 -2
- package/src/components/chat/brain-markdown.tsx +2 -2
- package/src/components/chat/chat-page.tsx +4 -0
- package/src/components/files/file-viewer-binary.tsx +2 -2
- package/src/components/files/file-viewer.tsx +2 -2
- package/src/components/graph/graph-page.tsx +3 -3
- package/src/components/images/mask-editor.tsx +2 -2
- package/src/config.ts +63 -4
- package/src/hooks/use-websocket.ts +55 -6
- package/src/index.ts +1 -1
- package/src/lib/api-client.ts +2 -2
- package/src/lib/backend.ts +16 -15
- package/src/lib/share-intake.ts +2 -2
- package/src/lib/share.ts +2 -2
- package/src/stores/chat-store.ts +50 -8
- package/src/stores/connection-store.ts +22 -0
- package/src/stores/file-store.ts +13 -5
- package/src/stores/graph-store.ts +7 -7
- package/dist/lib/ws-client.d.ts +0 -26
- package/dist/lib/ws-client.d.ts.map +0 -1
- package/dist/lib/ws-client.js +0 -93
- package/dist/lib/ws-client.js.map +0 -1
- package/src/lib/ws-client.ts +0 -109
package/dist/lib/ws-client.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
export class WSClient {
|
|
2
|
-
ws = null;
|
|
3
|
-
url;
|
|
4
|
-
onMessage;
|
|
5
|
-
onStatusChange;
|
|
6
|
-
reconnectAttempt = 0;
|
|
7
|
-
reconnectTimer = null;
|
|
8
|
-
closed = false;
|
|
9
|
-
constructor(url, onMessage, onStatusChange) {
|
|
10
|
-
this.url = url;
|
|
11
|
-
this.onMessage = onMessage;
|
|
12
|
-
this.onStatusChange = onStatusChange;
|
|
13
|
-
}
|
|
14
|
-
connect() {
|
|
15
|
-
this.closed = false;
|
|
16
|
-
this.onStatusChange("connecting");
|
|
17
|
-
try {
|
|
18
|
-
this.ws = new WebSocket(this.url);
|
|
19
|
-
this.ws.onopen = () => {
|
|
20
|
-
this.reconnectAttempt = 0;
|
|
21
|
-
this.onStatusChange("connected");
|
|
22
|
-
};
|
|
23
|
-
this.ws.onmessage = (evt) => {
|
|
24
|
-
try {
|
|
25
|
-
const msg = JSON.parse(evt.data);
|
|
26
|
-
this.onMessage(msg);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
console.error("[ws] Failed to parse message:", evt.data);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
this.ws.onclose = () => {
|
|
33
|
-
this.onStatusChange("disconnected");
|
|
34
|
-
if (!this.closed) {
|
|
35
|
-
this.scheduleReconnect();
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
this.ws.onerror = () => {
|
|
39
|
-
// onclose will fire after onerror
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
this.onStatusChange("disconnected");
|
|
44
|
-
if (!this.closed) {
|
|
45
|
-
this.scheduleReconnect();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
send(msg) {
|
|
50
|
-
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
51
|
-
this.ws.send(JSON.stringify(msg));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
close() {
|
|
55
|
-
this.closed = true;
|
|
56
|
-
if (this.reconnectTimer) {
|
|
57
|
-
clearTimeout(this.reconnectTimer);
|
|
58
|
-
this.reconnectTimer = null;
|
|
59
|
-
}
|
|
60
|
-
this.ws?.close();
|
|
61
|
-
this.ws = null;
|
|
62
|
-
}
|
|
63
|
-
get isConnected() {
|
|
64
|
-
return this.ws?.readyState === WebSocket.OPEN;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Skip the remaining backoff and reconnect immediately (e.g. when the
|
|
68
|
-
* browser fires an `online` event). No-op if open/connecting or closed
|
|
69
|
-
* deliberately.
|
|
70
|
-
*/
|
|
71
|
-
reconnectNow() {
|
|
72
|
-
if (this.closed)
|
|
73
|
-
return;
|
|
74
|
-
const state = this.ws?.readyState;
|
|
75
|
-
if (state === WebSocket.OPEN || state === WebSocket.CONNECTING)
|
|
76
|
-
return;
|
|
77
|
-
if (this.reconnectTimer) {
|
|
78
|
-
clearTimeout(this.reconnectTimer);
|
|
79
|
-
this.reconnectTimer = null;
|
|
80
|
-
}
|
|
81
|
-
this.reconnectAttempt = 0;
|
|
82
|
-
this.connect();
|
|
83
|
-
}
|
|
84
|
-
scheduleReconnect() {
|
|
85
|
-
const delay = Math.min(1000 * 2 ** this.reconnectAttempt, 30000);
|
|
86
|
-
this.reconnectAttempt++;
|
|
87
|
-
this.reconnectTimer = setTimeout(() => {
|
|
88
|
-
this.reconnectTimer = null;
|
|
89
|
-
this.connect();
|
|
90
|
-
}, delay);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=ws-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../../src/lib/ws-client.ts"],"names":[],"mappings":"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"}
|
package/src/lib/ws-client.ts
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import type { ClientMessage, ServerMessage } from "@schlessera/brain-ui-sdk/protocol";
|
|
2
|
-
|
|
3
|
-
type MessageHandler = (msg: ServerMessage) => void;
|
|
4
|
-
type StatusHandler = (status: "connecting" | "connected" | "disconnected") => void;
|
|
5
|
-
|
|
6
|
-
export class WSClient {
|
|
7
|
-
private ws: WebSocket | null = null;
|
|
8
|
-
private url: string;
|
|
9
|
-
private onMessage: MessageHandler;
|
|
10
|
-
private onStatusChange: StatusHandler;
|
|
11
|
-
private reconnectAttempt = 0;
|
|
12
|
-
private reconnectTimer: ReturnType<typeof setTimeout> | null = null;
|
|
13
|
-
private closed = false;
|
|
14
|
-
|
|
15
|
-
constructor(
|
|
16
|
-
url: string,
|
|
17
|
-
onMessage: MessageHandler,
|
|
18
|
-
onStatusChange: StatusHandler
|
|
19
|
-
) {
|
|
20
|
-
this.url = url;
|
|
21
|
-
this.onMessage = onMessage;
|
|
22
|
-
this.onStatusChange = onStatusChange;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
connect() {
|
|
26
|
-
this.closed = false;
|
|
27
|
-
this.onStatusChange("connecting");
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
this.ws = new WebSocket(this.url);
|
|
31
|
-
|
|
32
|
-
this.ws.onopen = () => {
|
|
33
|
-
this.reconnectAttempt = 0;
|
|
34
|
-
this.onStatusChange("connected");
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
this.ws.onmessage = (evt) => {
|
|
38
|
-
try {
|
|
39
|
-
const msg = JSON.parse(evt.data) as ServerMessage;
|
|
40
|
-
this.onMessage(msg);
|
|
41
|
-
} catch {
|
|
42
|
-
console.error("[ws] Failed to parse message:", evt.data);
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
this.ws.onclose = () => {
|
|
47
|
-
this.onStatusChange("disconnected");
|
|
48
|
-
if (!this.closed) {
|
|
49
|
-
this.scheduleReconnect();
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
this.ws.onerror = () => {
|
|
54
|
-
// onclose will fire after onerror
|
|
55
|
-
};
|
|
56
|
-
} catch {
|
|
57
|
-
this.onStatusChange("disconnected");
|
|
58
|
-
if (!this.closed) {
|
|
59
|
-
this.scheduleReconnect();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
send(msg: ClientMessage) {
|
|
65
|
-
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
66
|
-
this.ws.send(JSON.stringify(msg));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
close() {
|
|
71
|
-
this.closed = true;
|
|
72
|
-
if (this.reconnectTimer) {
|
|
73
|
-
clearTimeout(this.reconnectTimer);
|
|
74
|
-
this.reconnectTimer = null;
|
|
75
|
-
}
|
|
76
|
-
this.ws?.close();
|
|
77
|
-
this.ws = null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
get isConnected(): boolean {
|
|
81
|
-
return this.ws?.readyState === WebSocket.OPEN;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Skip the remaining backoff and reconnect immediately (e.g. when the
|
|
86
|
-
* browser fires an `online` event). No-op if open/connecting or closed
|
|
87
|
-
* deliberately.
|
|
88
|
-
*/
|
|
89
|
-
reconnectNow() {
|
|
90
|
-
if (this.closed) return;
|
|
91
|
-
const state = this.ws?.readyState;
|
|
92
|
-
if (state === WebSocket.OPEN || state === WebSocket.CONNECTING) return;
|
|
93
|
-
if (this.reconnectTimer) {
|
|
94
|
-
clearTimeout(this.reconnectTimer);
|
|
95
|
-
this.reconnectTimer = null;
|
|
96
|
-
}
|
|
97
|
-
this.reconnectAttempt = 0;
|
|
98
|
-
this.connect();
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
private scheduleReconnect() {
|
|
102
|
-
const delay = Math.min(1000 * 2 ** this.reconnectAttempt, 30000);
|
|
103
|
-
this.reconnectAttempt++;
|
|
104
|
-
this.reconnectTimer = setTimeout(() => {
|
|
105
|
-
this.reconnectTimer = null;
|
|
106
|
-
this.connect();
|
|
107
|
-
}, delay);
|
|
108
|
-
}
|
|
109
|
-
}
|