@modularizer/plat 0.7.0 → 0.9.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.
Files changed (92) hide show
  1. package/README.md +75 -0
  2. package/dist/client-server-entry.d.ts +5 -0
  3. package/dist/client-server-entry.d.ts.map +1 -1
  4. package/dist/client-server-entry.js +5 -0
  5. package/dist/client-server-entry.js.map +1 -1
  6. package/dist/client-side-python/runtime.d.ts +1 -0
  7. package/dist/client-side-python/runtime.d.ts.map +1 -1
  8. package/dist/client-side-python/runtime.js +10 -1
  9. package/dist/client-side-python/runtime.js.map +1 -1
  10. package/dist/client-side-server/channel.d.ts +1 -1
  11. package/dist/client-side-server/channel.d.ts.map +1 -1
  12. package/dist/client-side-server/channel.js +113 -4
  13. package/dist/client-side-server/channel.js.map +1 -1
  14. package/dist/client-side-server/identity.d.ts +4 -2
  15. package/dist/client-side-server/identity.d.ts.map +1 -1
  16. package/dist/client-side-server/identity.js +30 -2
  17. package/dist/client-side-server/identity.js.map +1 -1
  18. package/dist/client-side-server/mqtt-webrtc.d.ts +84 -3
  19. package/dist/client-side-server/mqtt-webrtc.d.ts.map +1 -1
  20. package/dist/client-side-server/mqtt-webrtc.js +267 -10
  21. package/dist/client-side-server/mqtt-webrtc.js.map +1 -1
  22. package/dist/client-side-server/plat-bridge.d.ts +40 -0
  23. package/dist/client-side-server/plat-bridge.d.ts.map +1 -0
  24. package/dist/client-side-server/plat-bridge.js +876 -0
  25. package/dist/client-side-server/plat-bridge.js.map +1 -0
  26. package/dist/client-side-server/plat-fetch.d.ts +33 -0
  27. package/dist/client-side-server/plat-fetch.d.ts.map +1 -0
  28. package/dist/client-side-server/plat-fetch.js +199 -0
  29. package/dist/client-side-server/plat-fetch.js.map +1 -0
  30. package/dist/client-side-server/plat-service-worker-client.d.ts +30 -0
  31. package/dist/client-side-server/plat-service-worker-client.d.ts.map +1 -0
  32. package/dist/client-side-server/plat-service-worker-client.js +141 -0
  33. package/dist/client-side-server/plat-service-worker-client.js.map +1 -0
  34. package/dist/client-side-server/plat-service-worker.d.ts +35 -0
  35. package/dist/client-side-server/plat-service-worker.d.ts.map +1 -0
  36. package/dist/client-side-server/plat-service-worker.js +292 -0
  37. package/dist/client-side-server/plat-service-worker.js.map +1 -0
  38. package/dist/client-side-server/protocol.d.ts +68 -1
  39. package/dist/client-side-server/protocol.d.ts.map +1 -1
  40. package/dist/client-side-server/protocol.js +7 -0
  41. package/dist/client-side-server/protocol.js.map +1 -1
  42. package/dist/client-side-server/runtime.d.ts +16 -1
  43. package/dist/client-side-server/runtime.d.ts.map +1 -1
  44. package/dist/client-side-server/runtime.js +41 -13
  45. package/dist/client-side-server/runtime.js.map +1 -1
  46. package/dist/client-side-server/server.d.ts +34 -1
  47. package/dist/client-side-server/server.d.ts.map +1 -1
  48. package/dist/client-side-server/server.js +171 -7
  49. package/dist/client-side-server/server.js.map +1 -1
  50. package/dist/client-side-server/worker-pool.d.ts +20 -0
  51. package/dist/client-side-server/worker-pool.d.ts.map +1 -0
  52. package/dist/client-side-server/worker-pool.js +336 -0
  53. package/dist/client-side-server/worker-pool.js.map +1 -0
  54. package/dist/generated/python-browser-sources.js +4 -4
  55. package/dist/generated/python-browser-sources.js.map +1 -1
  56. package/dist/server/authority-server.d.ts +1 -1
  57. package/dist/server/authority-server.d.ts.map +1 -1
  58. package/dist/server/authority-server.js +27 -14
  59. package/dist/server/authority-server.js.map +1 -1
  60. package/dist/server/core.d.ts +8 -0
  61. package/dist/server/core.d.ts.map +1 -1
  62. package/dist/server/core.js +21 -0
  63. package/dist/server/core.js.map +1 -1
  64. package/dist/server/server.d.ts +4 -0
  65. package/dist/server/server.d.ts.map +1 -1
  66. package/dist/server/server.js +81 -2
  67. package/dist/server/server.js.map +1 -1
  68. package/dist/static/file-response.d.ts +42 -0
  69. package/dist/static/file-response.d.ts.map +1 -0
  70. package/dist/static/file-response.js +57 -0
  71. package/dist/static/file-response.js.map +1 -0
  72. package/dist/static/glob-match.d.ts +16 -0
  73. package/dist/static/glob-match.d.ts.map +1 -0
  74. package/dist/static/glob-match.js +48 -0
  75. package/dist/static/glob-match.js.map +1 -0
  76. package/dist/static/index.d.ts +9 -0
  77. package/dist/static/index.d.ts.map +1 -0
  78. package/dist/static/index.js +6 -0
  79. package/dist/static/index.js.map +1 -0
  80. package/dist/static/mime-types.d.ts +6 -0
  81. package/dist/static/mime-types.d.ts.map +1 -0
  82. package/dist/static/mime-types.js +74 -0
  83. package/dist/static/mime-types.js.map +1 -0
  84. package/dist/static/static-folder.d.ts +69 -0
  85. package/dist/static/static-folder.d.ts.map +1 -0
  86. package/dist/static/static-folder.js +206 -0
  87. package/dist/static/static-folder.js.map +1 -0
  88. package/dist/static/virtual-file-system.d.ts +45 -0
  89. package/dist/static/virtual-file-system.d.ts.map +1 -0
  90. package/dist/static/virtual-file-system.js +100 -0
  91. package/dist/static/virtual-file-system.js.map +1 -0
  92. package/package.json +5 -1
@@ -0,0 +1,292 @@
1
+ /**
2
+ * plat-service-worker: Universal HTTP interception via Service Worker
3
+ *
4
+ * Registers a Service Worker that intercepts ALL fetch events (fetch, XHR,
5
+ * resource elements, forms, everything) and routes them through the plat channel.
6
+ *
7
+ * This is the lowest-level interception point in the browser and eliminates the
8
+ * need for monkey-patching fetch, XHR, EventSource, Worker, forms, etc.
9
+ */
10
+ /**
11
+ * Install the plat bridge via Service Worker.
12
+ * This is the recommended approach—it intercepts all HTTP requests at the
13
+ * browser's network layer.
14
+ *
15
+ * Requires the Service Worker to be available as a static file or via a server endpoint.
16
+ * Returns a handle to unregister the Service Worker.
17
+ * Throws if Service Workers are not supported or registration fails.
18
+ */
19
+ export async function installServiceWorkerBridge(_channel, options) {
20
+ if (!navigator.serviceWorker) {
21
+ throw new Error('Service Workers not supported in this browser. ' +
22
+ 'Ensure HTTPS or localhost is enabled.');
23
+ }
24
+ const scope = options?.scope ?? '/';
25
+ const workerUrl = options?.workerUrl ?? '/plat-service-worker.js';
26
+ try {
27
+ const registration = await navigator.serviceWorker.register(workerUrl, { scope });
28
+ if (registration.waiting) {
29
+ registration.waiting.postMessage({ type: 'PLAT_SKIP_WAITING' });
30
+ }
31
+ await navigator.serviceWorker.ready;
32
+ if (!navigator.serviceWorker.controller) {
33
+ await waitForController(1200);
34
+ }
35
+ return {
36
+ async unregister() {
37
+ await registration.unregister();
38
+ },
39
+ };
40
+ }
41
+ catch (err) {
42
+ throw new Error(`Failed to register Service Worker at ${workerUrl}: ` +
43
+ (err instanceof Error ? err.message : String(err)));
44
+ }
45
+ }
46
+ /**
47
+ * Generate the complete Service Worker code as a string.
48
+ * This is what you'd serve as /plat-service-worker.js or similar.
49
+ *
50
+ * The worker communicates with the main thread via postMessage to fetch requests.
51
+ */
52
+ export function generateServiceWorkerCode() {
53
+ return `(${serviceWorkerRuntime.toString()})()`;
54
+ }
55
+ function waitForController(timeoutMs) {
56
+ if (navigator.serviceWorker.controller)
57
+ return Promise.resolve();
58
+ return new Promise((resolve) => {
59
+ let done = false;
60
+ const complete = () => {
61
+ if (done)
62
+ return;
63
+ done = true;
64
+ navigator.serviceWorker.removeEventListener('controllerchange', onChange);
65
+ clearTimeout(timer);
66
+ resolve();
67
+ };
68
+ const onChange = () => complete();
69
+ const timer = setTimeout(() => complete(), timeoutMs);
70
+ navigator.serviceWorker.addEventListener('controllerchange', onChange);
71
+ });
72
+ }
73
+ /**
74
+ * The Service Worker runtime—runs in the worker context.
75
+ * Must be self-contained (no external dependencies).
76
+ * Communicates with main thread via postMessage to route requests through platFetch.
77
+ */
78
+ function serviceWorkerRuntime() {
79
+ // Interception logic (matches main thread)
80
+ function shouldIntercept(url) {
81
+ if (url.startsWith('data:') || url.startsWith('blob:') || url.startsWith('javascript:'))
82
+ return false;
83
+ if (url.startsWith('css://'))
84
+ return true;
85
+ try {
86
+ const parsed = new URL(url, self.location.href);
87
+ return parsed.origin === self.location.origin;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ }
93
+ function normalizePath(url) {
94
+ if (url.startsWith('css://')) {
95
+ try {
96
+ const parsed = new URL(url.replace('css://', 'http://'));
97
+ return `${parsed.pathname}${parsed.search}`;
98
+ }
99
+ catch {
100
+ return url;
101
+ }
102
+ }
103
+ if (url.startsWith('/'))
104
+ return url;
105
+ try {
106
+ const parsed = new URL(url, self.location.href);
107
+ return `${parsed.pathname}${parsed.search}`;
108
+ }
109
+ catch {
110
+ return '/' + url;
111
+ }
112
+ }
113
+ // Map request IDs to pending responses
114
+ const pending = new Map();
115
+ function randomId() {
116
+ return `sw-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
117
+ }
118
+ function bytesToBase64(bytes) {
119
+ const chunk = 0x8000;
120
+ let binary = '';
121
+ for (let i = 0; i < bytes.length; i += chunk) {
122
+ binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
123
+ }
124
+ return btoa(binary);
125
+ }
126
+ async function readRequestBodyAsBase64(req) {
127
+ if (req.method === 'GET' || req.method === 'HEAD')
128
+ return undefined;
129
+ const buf = await req.arrayBuffer();
130
+ if (buf.byteLength === 0)
131
+ return undefined;
132
+ return bytesToBase64(new Uint8Array(buf));
133
+ }
134
+ function fromBridgeBody(msg) {
135
+ if (msg.bodyEncoding === 'none')
136
+ return msg.body ?? null;
137
+ if (!msg.body)
138
+ return null;
139
+ const binaryStr = atob(msg.body);
140
+ const bytes = new Uint8Array(binaryStr.length);
141
+ for (let i = 0; i < binaryStr.length; i++)
142
+ bytes[i] = binaryStr.charCodeAt(i);
143
+ return bytes;
144
+ }
145
+ async function resolveClientForRequest(clientId) {
146
+ // @ts-ignore - Service Worker clients API
147
+ if (clientId) {
148
+ // @ts-ignore - Service Worker clients API
149
+ const target = await self.clients.get(clientId);
150
+ if (target)
151
+ return target;
152
+ }
153
+ // @ts-ignore - Service Worker clients API
154
+ const all = await self.clients.matchAll({ type: 'window', includeUncontrolled: true });
155
+ return all[0];
156
+ }
157
+ // Listen for responses from main thread
158
+ // @ts-ignore - Service Worker event
159
+ self.addEventListener('message', (event) => {
160
+ if (event.data?.type === 'PLAT_SKIP_WAITING') {
161
+ // @ts-ignore - Service Worker global API
162
+ self.skipWaiting();
163
+ return;
164
+ }
165
+ const msg = event.data;
166
+ if (msg.type === 'PLAT_RESPONSE') {
167
+ const p = pending.get(msg.id);
168
+ if (p) {
169
+ pending.delete(msg.id);
170
+ if (msg.error) {
171
+ p.reject(new Error(msg.error));
172
+ }
173
+ else {
174
+ p.resolve(msg);
175
+ }
176
+ }
177
+ }
178
+ });
179
+ // Intercept all fetch events
180
+ // @ts-ignore - Service Worker event
181
+ self.addEventListener('fetch', (event) => {
182
+ const url = event.request.url;
183
+ if (!shouldIntercept(url))
184
+ return;
185
+ const path = normalizePath(url);
186
+ const method = event.request.method;
187
+ const headers = {};
188
+ event.request.headers.forEach((value, key) => {
189
+ headers[key.toLowerCase()] = value;
190
+ });
191
+ event.respondWith((async () => {
192
+ try {
193
+ const body = await readRequestBodyAsBase64(event.request.clone());
194
+ // Send request to main thread and wait for response
195
+ const id = randomId();
196
+ const target = await resolveClientForRequest(event.clientId);
197
+ if (!target) {
198
+ throw new Error('No client available to handle request');
199
+ }
200
+ const responsePromise = new Promise((resolve, reject) => {
201
+ pending.set(id, { resolve, reject });
202
+ });
203
+ const msg = {
204
+ type: 'PLAT_REQUEST',
205
+ id,
206
+ clientId: event.clientId,
207
+ method,
208
+ path,
209
+ headers,
210
+ bodyEncoding: body ? 'base64' : 'none',
211
+ body,
212
+ };
213
+ target.postMessage(msg);
214
+ // Wait for response with timeout
215
+ const responseData = (await Promise.race([
216
+ responsePromise,
217
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Service Worker request timeout')), 30000)),
218
+ ]).finally(() => {
219
+ pending.delete(id);
220
+ }));
221
+ if (responseData.error) {
222
+ throw new Error(responseData.error);
223
+ }
224
+ const responseBody = fromBridgeBody(responseData);
225
+ return new Response(responseBody, {
226
+ status: responseData.status,
227
+ statusText: responseData.statusText,
228
+ headers: new Headers(responseData.headers),
229
+ });
230
+ }
231
+ catch (err) {
232
+ // Clear any orphaned pending entries if this request failed before response.
233
+ // No-op if already removed.
234
+ // (request ids are unique per request)
235
+ const message = err instanceof Error ? err.message : String(err);
236
+ return new Response(`[Service Worker] ${message}`, {
237
+ status: 500,
238
+ statusText: 'Internal Server Error',
239
+ headers: { 'content-type': 'text/plain' },
240
+ });
241
+ }
242
+ })());
243
+ });
244
+ // Claim all clients
245
+ // @ts-ignore - Service Worker event
246
+ self.addEventListener('activate', (event) => {
247
+ // @ts-ignore - Service Worker clients API
248
+ event.waitUntil(self.clients.claim());
249
+ });
250
+ // @ts-ignore - Service Worker event
251
+ self.addEventListener('install', () => {
252
+ // @ts-ignore - Service Worker global API
253
+ self.skipWaiting();
254
+ });
255
+ }
256
+ // ── Shared helpers ───────────────────────────────────────────────────────────
257
+ function shouldIntercept(url) {
258
+ if (url.startsWith('data:') || url.startsWith('blob:') || url.startsWith('javascript:'))
259
+ return false;
260
+ if (url.startsWith('/') || !url.includes('://'))
261
+ return true;
262
+ if (url.startsWith('css://'))
263
+ return true;
264
+ try {
265
+ const parsed = new URL(url, window.location.href);
266
+ return parsed.origin === window.location.origin;
267
+ }
268
+ catch {
269
+ return false;
270
+ }
271
+ }
272
+ function normalizePath(url) {
273
+ if (url.startsWith('css://')) {
274
+ try {
275
+ const parsed = new URL(url.replace('css://', 'http://'));
276
+ return `${parsed.pathname}${parsed.search}`;
277
+ }
278
+ catch {
279
+ return url;
280
+ }
281
+ }
282
+ if (url.startsWith('/'))
283
+ return url;
284
+ try {
285
+ const parsed = new URL(url, typeof window !== 'undefined' ? window.location.href : 'http://localhost/');
286
+ return `${parsed.pathname}${parsed.search}`;
287
+ }
288
+ catch {
289
+ return '/' + url;
290
+ }
291
+ }
292
+ //# sourceMappingURL=plat-service-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plat-service-worker.js","sourceRoot":"","sources":["../../src/client-side-server/plat-service-worker.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,46 @@
1
1
  import type { PLATRPCEventKind } from '../rpc';
2
+ /**
3
+ * Version and identity metadata that a server publishes about itself.
4
+ * All fields are optional — servers populate what they know.
5
+ * `openapiHash` and `serverStartedAt` are auto-computed; the rest are user-supplied.
6
+ */
7
+ export interface ClientSideServerInstanceInfo {
8
+ /** Semantic version string, e.g. "1.2.3" or "2026-04-07". */
9
+ version?: string;
10
+ /** Commit hash, build hash, or any content-identifier for the server code. */
11
+ versionHash?: string;
12
+ /**
13
+ * SHA-256 hex digest of the server's openapi.json (computed automatically
14
+ * from the generated spec; stable for the same set of controllers and options).
15
+ */
16
+ openapiHash?: string;
17
+ /** Unix timestamp (ms) when the server code / deployment was last updated. */
18
+ updatedAt?: number;
19
+ /** Unix timestamp (ms) when this server instance started (auto-set on start). */
20
+ serverStartedAt?: number;
21
+ }
22
+ export type ServiceWorkerBridgeBodyEncoding = 'none' | 'base64';
23
+ export interface ServiceWorkerBridgeRequestMessage {
24
+ type: 'PLAT_REQUEST';
25
+ id: string;
26
+ clientId?: string;
27
+ method: string;
28
+ path: string;
29
+ headers: Record<string, string>;
30
+ bodyEncoding: ServiceWorkerBridgeBodyEncoding;
31
+ body?: string;
32
+ }
33
+ export interface ServiceWorkerBridgeResponseMessage {
34
+ type: 'PLAT_RESPONSE';
35
+ id: string;
36
+ status: number;
37
+ statusText: string;
38
+ headers: Record<string, string>;
39
+ bodyEncoding: ServiceWorkerBridgeBodyEncoding;
40
+ body?: string;
41
+ error?: string;
42
+ errorCode?: 'timeout' | 'no-client' | 'upstream-failed' | 'bad-response';
43
+ }
2
44
  export interface ClientSideServerRequest {
3
45
  jsonrpc: '2.0';
4
46
  id: string;
@@ -39,10 +81,35 @@ export interface ClientSideServerPeerMessage {
39
81
  fromPeerId?: string;
40
82
  fromServerName?: string;
41
83
  }
84
+ export interface ClientSideServerPingMessage {
85
+ platcss: 'ping';
86
+ ts: number;
87
+ }
88
+ export interface ClientSideServerPongMessage {
89
+ platcss: 'pong';
90
+ ts: number;
91
+ }
92
+ export interface ClientSideServerDrainMessage {
93
+ platcss: 'drain';
94
+ }
95
+ export interface ClientSideServerPrivateChallengeRequest {
96
+ platcss: 'private-challenge';
97
+ challengeNonce: string;
98
+ clientIdentity?: import('./identity').ClientSideServerPublicIdentity;
99
+ }
100
+ export interface ClientSideServerPrivateChallengeResponse {
101
+ platcss: 'private-challenge-response';
102
+ challengeNonce: string;
103
+ challengeSignature: string;
104
+ identity: import('./identity').ClientSideServerPublicIdentity;
105
+ authorityRecord?: import('./identity').ClientSideServerSignedAuthorityRecord;
106
+ }
107
+ export type ClientSideServerControlMessage = ClientSideServerPingMessage | ClientSideServerPongMessage | ClientSideServerDrainMessage | ClientSideServerPrivateChallengeRequest | ClientSideServerPrivateChallengeResponse;
42
108
  export type ClientSideServerResponse = ClientSideServerSuccessResponse | ClientSideServerErrorResponse;
43
109
  export type ClientSideServerRPCMessage = ClientSideServerRequest | ClientSideServerResponse | ClientSideServerEventMessage;
44
- export type ClientSideServerMessage = ClientSideServerRPCMessage | ClientSideServerPeerMessage;
110
+ export type ClientSideServerMessage = ClientSideServerRPCMessage | ClientSideServerPeerMessage | ClientSideServerControlMessage;
45
111
  export declare function isClientSideServerPeerMessage(message: ClientSideServerMessage): message is ClientSideServerPeerMessage;
112
+ export declare function isClientSideServerControlMessage(message: ClientSideServerMessage): message is ClientSideServerControlMessage;
46
113
  export declare function isClientSideServerRequestMessage(message: ClientSideServerMessage): message is ClientSideServerRequest;
47
114
  export declare function isClientSideServerEventMessage(message: ClientSideServerMessage): message is ClientSideServerEventMessage;
48
115
  export declare function isClientSideServerResponseMessage(message: ClientSideServerMessage): message is ClientSideServerResponse;
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/client-side-server/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAE9C,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,OAAO,CAAA;KACf,CAAA;CACF;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,IAAI,CAAA;IACR,KAAK,EAAE,gBAAgB,CAAA;IACvB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,wBAAwB,GAChC,+BAA+B,GAC/B,6BAA6B,CAAA;AAEjC,MAAM,MAAM,0BAA0B,GAClC,uBAAuB,GACvB,wBAAwB,GACxB,4BAA4B,CAAA;AAEhC,MAAM,MAAM,uBAAuB,GAC/B,0BAA0B,GAC1B,2BAA2B,CAAA;AAE/B,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,IAAI,2BAA2B,CAEtH;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,IAAI,uBAAuB,CAErH;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,IAAI,4BAA4B,CAExH;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,uBAAuB,GAC/B,OAAO,IAAI,wBAAwB,CAErC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/client-side-server/protocol.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  export function isClientSideServerPeerMessage(message) {
2
2
  return 'platcss' in message && message.platcss === 'peer';
3
3
  }
4
+ export function isClientSideServerControlMessage(message) {
5
+ if (!('platcss' in message))
6
+ return false;
7
+ const kind = message.platcss;
8
+ return kind === 'ping' || kind === 'pong' || kind === 'drain'
9
+ || kind === 'private-challenge' || kind === 'private-challenge-response';
10
+ }
4
11
  export function isClientSideServerRequestMessage(message) {
5
12
  return 'jsonrpc' in message && 'method' in message && 'path' in message;
6
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/client-side-server/protocol.ts"],"names":[],"mappings":"AA4DA,MAAM,UAAU,6BAA6B,CAAC,OAAgC;IAC5E,OAAO,SAAS,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAgC;IAC/E,OAAO,SAAS,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,CAAA;AACzE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAgC;IAC7E,OAAO,SAAS,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAA;AAC1E,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,OAAgC;IAEhC,OAAO,SAAS,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAA;AACnG,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/client-side-server/protocol.ts"],"names":[],"mappings":"AA8IA,MAAM,UAAU,6BAA6B,CAAC,OAAgC;IAC5E,OAAO,SAAS,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAgC;IAC/E,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IACzC,MAAM,IAAI,GAAI,OAAe,CAAC,OAAO,CAAA;IACrC,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO;WACxD,IAAI,KAAK,mBAAmB,IAAI,IAAI,KAAK,4BAA4B,CAAA;AAC5E,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAgC;IAC/E,OAAO,SAAS,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,CAAA;AACzE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAgC;IAC7E,OAAO,SAAS,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAA;AAC1E,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,OAAgC;IAEhC,OAAO,SAAS,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAA;AACnG,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { OpenAPIClient } from '../client/openapi-client';
2
2
  import type { OpenAPISpec } from '../types/openapi';
3
- import { type ClientSideServerMQTTWebRTCOptions, type ClientSideServerMQTTWebRTCServer } from './mqtt-webrtc';
3
+ import { type ClientSideServerMQTTWebRTCOptions, type ClientSideServerMQTTWebRTCServer, type ClientSideServerWorkerInfo } from './mqtt-webrtc';
4
4
  import { type PLATClientSideServer } from './server';
5
5
  import { type ClientSideServerSourceAnalysis, type TypeScriptLike } from './source-analysis';
6
6
  type ControllerClass = new () => any;
@@ -18,6 +18,12 @@ export interface ClientSideServerSourceModule {
18
18
  export interface StartClientSideServerFromSourceOptions extends ClientSideServerMQTTWebRTCOptions {
19
19
  serverName?: string;
20
20
  undecoratedMode?: 'GET' | 'POST' | 'private';
21
+ workerInfo?: ClientSideServerWorkerInfo;
22
+ /**
23
+ * Version / identity metadata published in MQTT announces and via the `/server-info` endpoint.
24
+ * `openapiHash` and `serverStartedAt` are auto-computed; the rest are user-supplied.
25
+ */
26
+ instanceInfo?: import('./protocol').ClientSideServerInstanceInfo;
21
27
  source: string | Record<string, string>;
22
28
  /**
23
29
  * Optional: specify which file is the entry point when using multiple source files.
@@ -64,6 +70,8 @@ export declare function runClientSideServer(source: Record<string, string>, opti
64
70
  export declare const runClientSideServerFromSource: typeof runClientSideServer;
65
71
  export declare function startClientSideServerFromSource(options: StartClientSideServerFromSourceOptions): Promise<StartedClientSideServer>;
66
72
  export declare function serveClientSideServer(serverName: string, controllers: ControllerClass[]): ClientSideServerDefinition;
73
+ /** Server-style alias for defining a client-side server module. */
74
+ export declare const serveServer: typeof serveClientSideServer;
67
75
  export interface ConnectClientSideServerOptions extends ClientSideServerMQTTWebRTCOptions {
68
76
  baseUrl: string;
69
77
  }
@@ -71,6 +79,13 @@ export declare function connectClientSideServer(options: ConnectClientSideServer
71
79
  client: OpenAPIClient;
72
80
  openapi: OpenAPISpec;
73
81
  }>;
82
+ /** Server-style alias for connecting to a server endpoint (css:// or http(s)://). */
83
+ export declare const connectServer: typeof connectClientSideServer;
84
+ /**
85
+ * Server-style alias for starting a client-side server from source.
86
+ * Mirrors the common `startServer(...)` naming across runtimes.
87
+ */
88
+ export declare const startServer: typeof runClientSideServer;
74
89
  export interface RetryLoopOptions {
75
90
  initialDelayMs?: number;
76
91
  maxDelayMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/client-side-server/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,EAGL,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACtC,MAAM,eAAe,CAAA;AACtB,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE5E,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAA;AAE1B,KAAK,eAAe,GAAG,UAAU,GAAG,CAAA;AAEpC,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,eAAe,EAAE,CAAA;CAC/B;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;IAC/B,gBAAgB,CAAC,EAAE,0BAA0B,CAAA;IAC7C,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,0BAA0B,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;KAAE,CAAA;CAC/F;AAED,MAAM,WAAW,sCAAuC,SAAQ,iCAAiC;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;IAC5C,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACtG,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAA;IAC1J,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC1E;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,oBAAoB,CAAA;IAC5B,QAAQ,EAAE,gCAAgC,CAAA;IAC1C,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,sCAAsC,EACtC,QAAQ,GAAG,WAAW,GAAG,eAAe,CACzC,GAAG;IACF,sFAAsF;IACtF,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACtG,kFAAkF;IAClF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAA;CAC3J,CAAA;AAED,yDAAyD;AACzD,MAAM,MAAM,oCAAoC,GAAG,0BAA0B,CAAA;AAE7E;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,uBAAuB,CAAC,CAAA;AACnC,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,CAAC,EAAE,0BAA0B,GAAG;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE,OAAO,CAAC,uBAAuB,CAAC,CAAA;AAsCnC,kDAAkD;AAClD,eAAO,MAAM,6BAA6B,4BAAsB,CAAA;AAgBhE,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,uBAAuB,CAAC,CAwElC;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,eAAe,EAAE,GAC7B,0BAA0B,CAE5B;AAGD,MAAM,WAAW,8BAA+B,SAAQ,iCAAiC;IACvF,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC;IACT,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,WAAW,CAAA;CACrB,CAAC,CAQD;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,IAAI,CAAA;IACZ,UAAU,IAAI,IAAI,CAAA;CACnB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAChC,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CA6DjB;AAsCD;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,eAAe,EAAE,EAC9B,QAAQ,EAAE,8BAA8B,GACvC,IAAI,CA6BN;AAED,wBAAgB,2CAA2C,CACzD,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,WAAW,EAAE,eAAe,EAAE,EAC9B,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAClF,8BAA8B,CAMhC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/client-side-server/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,EAGL,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,KAAK,0BAA0B,EAChC,MAAM,eAAe,CAAA;AACtB,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE5E,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAA;AAE1B,KAAK,eAAe,GAAG,UAAU,GAAG,CAAA;AAEpC,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,eAAe,EAAE,CAAA;CAC/B;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;IAC/B,gBAAgB,CAAC,EAAE,0BAA0B,CAAA;IAC7C,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,0BAA0B,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;KAAE,CAAA;CAC/F;AAED,MAAM,WAAW,sCAAuC,SAAQ,iCAAiC;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;IAC5C,UAAU,CAAC,EAAE,0BAA0B,CAAA;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,YAAY,EAAE,4BAA4B,CAAA;IAChE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACtG,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAA;IAC1J,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC1E;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,oBAAoB,CAAA;IAC5B,QAAQ,EAAE,gCAAgC,CAAA;IAC1C,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,sCAAsC,EACtC,QAAQ,GAAG,WAAW,GAAG,eAAe,CACzC,GAAG;IACF,sFAAsF;IACtF,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACtG,kFAAkF;IAClF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAA;CAC3J,CAAA;AAED,yDAAyD;AACzD,MAAM,MAAM,oCAAoC,GAAG,0BAA0B,CAAA;AAE7E;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,uBAAuB,CAAC,CAAA;AACnC,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,CAAC,EAAE,0BAA0B,GAAG;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE,OAAO,CAAC,uBAAuB,CAAC,CAAA;AAyCnC,kDAAkD;AAClD,eAAO,MAAM,6BAA6B,4BAAsB,CAAA;AAgBhE,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,uBAAuB,CAAC,CA6ElC;AAcD,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,eAAe,EAAE,GAC7B,0BAA0B,CAE5B;AAED,mEAAmE;AACnE,eAAO,MAAM,WAAW,8BAAwB,CAAA;AAGhD,MAAM,WAAW,8BAA+B,SAAQ,iCAAiC;IACvF,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC;IACT,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,WAAW,CAAA;CACrB,CAAC,CAQD;AAED,qFAAqF;AACrF,eAAO,MAAM,aAAa,gCAA0B,CAAA;AAEpD;;;GAGG;AACH,eAAO,MAAM,WAAW,4BAAsB,CAAA;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,IAAI,CAAA;IACZ,UAAU,IAAI,IAAI,CAAA;CACnB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAChC,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CA6DjB;AAsCD;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,eAAe,EAAE,EAC9B,QAAQ,EAAE,8BAA8B,GACvC,IAAI,CA6BN;AAED,wBAAgB,2CAA2C,CACzD,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,WAAW,EAAE,eAAe,EAAE,EAC9B,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAClF,8BAA8B,CAMhC"}
@@ -9,9 +9,11 @@ export async function runClientSideServer(source, options = {}) {
9
9
  const { transpile: customTranspile, analyzeSource: customAnalyze, ...rest } = options;
10
10
  const undecoratedMode = rest.undecoratedMode ?? 'POST';
11
11
  const entryPoint = options.sourceEntryPoint;
12
+ const normalizedSource = normalizeClientSideSourceImports(source);
12
13
  const defaultTranspile = (src, ep) => {
13
- if (typeof src === 'string') {
14
- return ts.transpileModule(src, {
14
+ const normalized = normalizeClientSideSourceImports(src);
15
+ if (typeof normalized === 'string') {
16
+ return ts.transpileModule(normalized, {
15
17
  compilerOptions: {
16
18
  module: ts.ModuleKind.ESNext,
17
19
  target: ts.ScriptTarget.ES2022,
@@ -19,17 +21,18 @@ export async function runClientSideServer(source, options = {}) {
19
21
  },
20
22
  }).outputText;
21
23
  }
22
- return transpileMultipleFiles(src, ts, ep);
24
+ return transpileMultipleFiles(normalized, ts, ep);
23
25
  };
24
26
  const defaultAnalyze = (src, ep) => {
25
- if (typeof src === 'string') {
26
- return analyzeClientSideServerSource(ts, src, { undecoratedMode });
27
+ const normalized = normalizeClientSideSourceImports(src);
28
+ if (typeof normalized === 'string') {
29
+ return analyzeClientSideServerSource(ts, normalized, { undecoratedMode });
27
30
  }
28
- return analyzeClientSideServerMultipleFiles(ts, src, { undecoratedMode, entryPoint: ep });
31
+ return analyzeClientSideServerMultipleFiles(ts, normalized, { undecoratedMode, entryPoint: ep });
29
32
  };
30
33
  return startClientSideServerFromSource({
31
34
  ...rest,
32
- source,
35
+ source: normalizedSource,
33
36
  sourceEntryPoint: entryPoint,
34
37
  transpile: customTranspile ?? defaultTranspile,
35
38
  analyzeSource: customAnalyze ?? defaultAnalyze,
@@ -52,16 +55,17 @@ function transpileSource(source, entryPoint) {
52
55
  }
53
56
  }
54
57
  export async function startClientSideServerFromSource(options) {
58
+ const normalizedSource = normalizeClientSideSourceImports(options.source);
55
59
  const compiled = await (options.transpile
56
- ? options.transpile(options.source, options.sourceEntryPoint)
57
- : Promise.resolve(transpileSource(options.source, options.sourceEntryPoint)));
60
+ ? options.transpile(normalizedSource, options.sourceEntryPoint)
61
+ : Promise.resolve(transpileSource(normalizedSource, options.sourceEntryPoint)));
58
62
  const analysis = await (options.analyzeSource
59
- ? options.analyzeSource(options.source, options.sourceEntryPoint)
60
- : Promise.resolve(typeof options.source === 'string'
61
- ? analyzeClientSideServerSource(ts, options.source, {
63
+ ? options.analyzeSource(normalizedSource, options.sourceEntryPoint)
64
+ : Promise.resolve(typeof normalizedSource === 'string'
65
+ ? analyzeClientSideServerSource(ts, normalizedSource, {
62
66
  undecoratedMode: options.undecoratedMode ?? 'POST',
63
67
  })
64
- : analyzeClientSideServerMultipleFiles(ts, options.source, {
68
+ : analyzeClientSideServerMultipleFiles(ts, normalizedSource, {
65
69
  undecoratedMode: options.undecoratedMode ?? 'POST',
66
70
  entryPoint: options.sourceEntryPoint,
67
71
  })));
@@ -79,6 +83,7 @@ export async function startClientSideServerFromSource(options) {
79
83
  }
80
84
  const server = createClientSideServer({
81
85
  undecoratedMode: options.undecoratedMode,
86
+ instanceInfo: options.instanceInfo,
82
87
  }, ...definition.controllers);
83
88
  if (options.onRequest) {
84
89
  const originalHandle = server.handleMessage.bind(server);
@@ -103,6 +108,9 @@ export async function startClientSideServerFromSource(options) {
103
108
  connectionTimeoutMs: options.connectionTimeoutMs,
104
109
  announceIntervalMs: options.announceIntervalMs,
105
110
  clientIdPrefix: options.clientIdPrefix,
111
+ identity: options.identity,
112
+ workerInfo: options.workerInfo,
113
+ instanceInfo: options.instanceInfo,
106
114
  });
107
115
  await signaler.start();
108
116
  return {
@@ -115,9 +123,22 @@ export async function startClientSideServerFromSource(options) {
115
123
  },
116
124
  };
117
125
  }
126
+ function normalizeClientSideSourceImports(source) {
127
+ const rewrite = (value) => value
128
+ // Browser runtime expects plat-client package specifiers for blob-module execution.
129
+ .replaceAll('@modularizer/plat/', '@modularizer/plat-client/')
130
+ // Legacy short static alias often pasted from old docs/snippets.
131
+ .replaceAll('"plat/static"', '"@modularizer/plat-client/static"')
132
+ .replaceAll("'plat/static'", "'@modularizer/plat-client/static'");
133
+ if (typeof source === 'string')
134
+ return rewrite(source);
135
+ return Object.fromEntries(Object.entries(source).map(([k, v]) => [k, rewrite(v)]));
136
+ }
118
137
  export function serveClientSideServer(serverName, controllers) {
119
138
  return { serverName, controllers };
120
139
  }
140
+ /** Server-style alias for defining a client-side server module. */
141
+ export const serveServer = serveClientSideServer;
121
142
  export async function connectClientSideServer(options) {
122
143
  const transportPlugin = createClientSideServerMQTTWebRTCTransportPlugin(options);
123
144
  const openapi = await fetchClientSideServerOpenAPI(options.baseUrl, transportPlugin);
@@ -127,6 +148,13 @@ export async function connectClientSideServer(options) {
127
148
  });
128
149
  return { client, openapi };
129
150
  }
151
+ /** Server-style alias for connecting to a server endpoint (css:// or http(s)://). */
152
+ export const connectServer = connectClientSideServer;
153
+ /**
154
+ * Server-style alias for starting a client-side server from source.
155
+ * Mirrors the common `startServer(...)` naming across runtimes.
156
+ */
157
+ export const startServer = runClientSideServer;
130
158
  export function startRetryLoop(task, options = {}) {
131
159
  const initialDelayMs = options.initialDelayMs ?? 2_000;
132
160
  const maxDelayMs = options.maxDelayMs ?? 30_000;