@hypen-space/core 0.4.2 → 0.4.5
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 +1 -1
- package/dist/app.d.ts +379 -0
- package/dist/app.js +111 -18
- package/dist/app.js.map +4 -4
- package/dist/components/builtin.d.ts +50 -0
- package/dist/components/builtin.js +114 -21
- package/dist/components/builtin.js.map +5 -5
- package/dist/context.d.ts +90 -0
- package/dist/discovery.d.ts +90 -0
- package/dist/discovery.js +121 -23
- package/dist/discovery.js.map +5 -5
- package/dist/disposable.d.ts +122 -0
- package/dist/engine.browser.d.ts +101 -0
- package/dist/engine.browser.js +192 -5
- package/dist/engine.browser.js.map +5 -4
- package/dist/engine.d.ts +85 -0
- package/dist/engine.js +192 -5
- package/dist/engine.js.map +5 -4
- package/dist/events.d.ts +78 -0
- package/dist/hypen.d.ts +127 -0
- package/dist/index.browser.d.ts +25 -0
- package/dist/index.browser.js +116 -19
- package/dist/index.browser.js.map +6 -6
- package/dist/index.d.ts +76 -0
- package/dist/index.js +373 -1235
- package/dist/index.js.map +10 -15
- package/dist/loader.d.ts +51 -0
- package/dist/logger.d.ts +141 -0
- package/dist/managed-router.d.ts +59 -0
- package/dist/plugin.d.ts +39 -0
- package/dist/remote/client.d.ts +154 -0
- package/dist/remote/client.js +34 -2
- package/dist/remote/client.js.map +3 -3
- package/dist/remote/index.d.ts +13 -0
- package/dist/remote/index.js +472 -26
- package/dist/remote/index.js.map +8 -7
- package/dist/remote/server.d.ts +173 -0
- package/dist/remote/server.js +472 -26
- package/dist/remote/server.js.map +8 -7
- package/dist/remote/session.d.ts +115 -0
- package/dist/remote/types.d.ts +98 -0
- package/dist/renderer.d.ts +54 -0
- package/dist/renderer.js +6 -2
- package/dist/renderer.js.map +3 -3
- package/dist/resolver.d.ts +95 -0
- package/dist/result.d.ts +134 -0
- package/dist/retry.d.ts +150 -0
- package/dist/router.d.ts +94 -0
- package/dist/state.d.ts +42 -0
- package/dist/types.d.ts +30 -0
- package/package.json +2 -1
- package/src/app.ts +162 -41
- package/src/components/builtin.ts +3 -4
- package/src/discovery.ts +2 -2
- package/src/engine.browser.ts +27 -4
- package/src/engine.ts +27 -4
- package/src/index.browser.ts +0 -2
- package/src/index.ts +3 -2
- package/src/managed-router.ts +5 -6
- package/src/remote/server.ts +116 -21
- package/src/result.ts +48 -0
- package/wasm-browser/hypen_engine_bg.wasm +0 -0
- package/wasm-browser/package.json +1 -1
- package/wasm-node/hypen_engine_bg.wasm +0 -0
- package/wasm-node/package.json +5 -3
- package/src/module-registry.ts +0 -76
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RemoteServer - Stream Hypen apps over WebSocket with Session Management
|
|
3
|
+
*
|
|
4
|
+
* Usage with inline UI:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { RemoteServer, app } from "@hypen-space/core";
|
|
7
|
+
*
|
|
8
|
+
* const counter = app
|
|
9
|
+
* .defineState({ count: 0 })
|
|
10
|
+
* .onAction("increment", ({ state }) => state.count++)
|
|
11
|
+
* .build();
|
|
12
|
+
*
|
|
13
|
+
* new RemoteServer()
|
|
14
|
+
* .module("Counter", counter)
|
|
15
|
+
* .ui(`Column { Text("Count: \${state.count}") }`)
|
|
16
|
+
* .listen(3000);
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Usage with directory-based discovery (auto-resolves imports):
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { RemoteServer } from "@hypen-space/core";
|
|
22
|
+
* import chatModule from "./apps/chat/Chat/component.js";
|
|
23
|
+
*
|
|
24
|
+
* await new RemoteServer()
|
|
25
|
+
* .source("./apps/chat")
|
|
26
|
+
* .module("Chat", chatModule)
|
|
27
|
+
* .listen(3001);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import type { HypenModule } from "../app.js";
|
|
31
|
+
import type { RemoteMessage, RemoteClient, RemoteServerConfig, SessionConfig } from "./types.js";
|
|
32
|
+
/**
|
|
33
|
+
* Builder pattern for hosting Hypen apps over WebSocket
|
|
34
|
+
*/
|
|
35
|
+
export declare class RemoteServer {
|
|
36
|
+
private _module;
|
|
37
|
+
private _moduleName;
|
|
38
|
+
private _ui;
|
|
39
|
+
private _sourceDir;
|
|
40
|
+
private _discoveredComponents;
|
|
41
|
+
private _config;
|
|
42
|
+
private _sessionConfig;
|
|
43
|
+
private _onConnectionCallbacks;
|
|
44
|
+
private _onDisconnectionCallbacks;
|
|
45
|
+
private clients;
|
|
46
|
+
private nextClientId;
|
|
47
|
+
private server;
|
|
48
|
+
private sessionManager;
|
|
49
|
+
/**
|
|
50
|
+
* Set the module for this app
|
|
51
|
+
*/
|
|
52
|
+
module(name: string, module: HypenModule<any>): this;
|
|
53
|
+
/**
|
|
54
|
+
* Set the UI DSL string
|
|
55
|
+
*/
|
|
56
|
+
ui(dsl: string): this;
|
|
57
|
+
/**
|
|
58
|
+
* Set a source directory for automatic component discovery.
|
|
59
|
+
*
|
|
60
|
+
* All .hypen and .ts components in the directory (and subdirectories) are
|
|
61
|
+
* discovered automatically. The entry component's template is used as the
|
|
62
|
+
* UI, so calling .ui() is optional when .source() is set.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* new RemoteServer()
|
|
67
|
+
* .source("./apps/chat")
|
|
68
|
+
* .module("Chat", chatModule)
|
|
69
|
+
* .listen(3001);
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
source(dir: string): this;
|
|
73
|
+
/**
|
|
74
|
+
* Set server configuration
|
|
75
|
+
*/
|
|
76
|
+
config(config: RemoteServerConfig): this;
|
|
77
|
+
/**
|
|
78
|
+
* Configure session management
|
|
79
|
+
*/
|
|
80
|
+
session(config: SessionConfig): this;
|
|
81
|
+
/**
|
|
82
|
+
* Register connection callback
|
|
83
|
+
*/
|
|
84
|
+
onConnection(callback: (client: RemoteClient) => void): this;
|
|
85
|
+
/**
|
|
86
|
+
* Register disconnection callback
|
|
87
|
+
*/
|
|
88
|
+
onDisconnection(callback: (client: RemoteClient) => void): this;
|
|
89
|
+
/**
|
|
90
|
+
* Start the WebSocket server
|
|
91
|
+
*/
|
|
92
|
+
listen(port?: number): Promise<this>;
|
|
93
|
+
/**
|
|
94
|
+
* Stop the server
|
|
95
|
+
*/
|
|
96
|
+
stop(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Get the server URL
|
|
99
|
+
*/
|
|
100
|
+
get url(): string | null;
|
|
101
|
+
/**
|
|
102
|
+
* Discover components from the source directory.
|
|
103
|
+
* Populates _discoveredComponents and sets _ui from the entry component
|
|
104
|
+
* if not already set via .ui().
|
|
105
|
+
*/
|
|
106
|
+
private discoverFromSource;
|
|
107
|
+
/**
|
|
108
|
+
* Set up a component resolver on a client engine so that imports
|
|
109
|
+
* and component references in templates are resolved from discovered
|
|
110
|
+
* components.
|
|
111
|
+
*/
|
|
112
|
+
private setupComponentResolver;
|
|
113
|
+
/**
|
|
114
|
+
* Handle new WebSocket connection
|
|
115
|
+
* Waits for hello message before fully initializing
|
|
116
|
+
*/
|
|
117
|
+
private handleOpen;
|
|
118
|
+
/**
|
|
119
|
+
* Initialize session for a client (new or resumed)
|
|
120
|
+
*/
|
|
121
|
+
private initializeSession;
|
|
122
|
+
/**
|
|
123
|
+
* Set up the render callback for streaming patches
|
|
124
|
+
*/
|
|
125
|
+
private setupRenderCallback;
|
|
126
|
+
/**
|
|
127
|
+
* Handle concurrent connection based on policy
|
|
128
|
+
* Returns true if connection is allowed, false if rejected
|
|
129
|
+
*/
|
|
130
|
+
private handleConcurrentConnection;
|
|
131
|
+
/**
|
|
132
|
+
* Trigger onReconnect hook
|
|
133
|
+
*/
|
|
134
|
+
private triggerReconnect;
|
|
135
|
+
/**
|
|
136
|
+
* Handle incoming WebSocket message
|
|
137
|
+
*/
|
|
138
|
+
private handleMessage;
|
|
139
|
+
/**
|
|
140
|
+
* Handle WebSocket close - suspend session instead of destroying
|
|
141
|
+
*/
|
|
142
|
+
private handleClose;
|
|
143
|
+
/**
|
|
144
|
+
* Get current client count
|
|
145
|
+
*/
|
|
146
|
+
getClientCount(): number;
|
|
147
|
+
/**
|
|
148
|
+
* Get session stats
|
|
149
|
+
*/
|
|
150
|
+
getSessionStats(): {
|
|
151
|
+
activeSessions: number;
|
|
152
|
+
pendingSessions: number;
|
|
153
|
+
totalConnections: number;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Broadcast a message to all connected clients
|
|
157
|
+
*/
|
|
158
|
+
broadcast(message: RemoteMessage): void;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Convenience function to create and start a RemoteServer
|
|
162
|
+
*/
|
|
163
|
+
export declare function serve(options: {
|
|
164
|
+
module: HypenModule<any>;
|
|
165
|
+
moduleName?: string;
|
|
166
|
+
ui?: string;
|
|
167
|
+
source?: string;
|
|
168
|
+
port?: number;
|
|
169
|
+
hostname?: string;
|
|
170
|
+
session?: SessionConfig;
|
|
171
|
+
onConnection?: (client: RemoteClient) => void;
|
|
172
|
+
onDisconnection?: (client: RemoteClient) => void;
|
|
173
|
+
}): Promise<RemoteServer>;
|