@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.
- package/README.md +75 -0
- package/dist/client-server-entry.d.ts +5 -0
- package/dist/client-server-entry.d.ts.map +1 -1
- package/dist/client-server-entry.js +5 -0
- package/dist/client-server-entry.js.map +1 -1
- package/dist/client-side-python/runtime.d.ts +1 -0
- package/dist/client-side-python/runtime.d.ts.map +1 -1
- package/dist/client-side-python/runtime.js +10 -1
- package/dist/client-side-python/runtime.js.map +1 -1
- package/dist/client-side-server/channel.d.ts +1 -1
- package/dist/client-side-server/channel.d.ts.map +1 -1
- package/dist/client-side-server/channel.js +113 -4
- package/dist/client-side-server/channel.js.map +1 -1
- package/dist/client-side-server/identity.d.ts +4 -2
- package/dist/client-side-server/identity.d.ts.map +1 -1
- package/dist/client-side-server/identity.js +30 -2
- package/dist/client-side-server/identity.js.map +1 -1
- package/dist/client-side-server/mqtt-webrtc.d.ts +84 -3
- package/dist/client-side-server/mqtt-webrtc.d.ts.map +1 -1
- package/dist/client-side-server/mqtt-webrtc.js +267 -10
- package/dist/client-side-server/mqtt-webrtc.js.map +1 -1
- package/dist/client-side-server/plat-bridge.d.ts +40 -0
- package/dist/client-side-server/plat-bridge.d.ts.map +1 -0
- package/dist/client-side-server/plat-bridge.js +876 -0
- package/dist/client-side-server/plat-bridge.js.map +1 -0
- package/dist/client-side-server/plat-fetch.d.ts +33 -0
- package/dist/client-side-server/plat-fetch.d.ts.map +1 -0
- package/dist/client-side-server/plat-fetch.js +199 -0
- package/dist/client-side-server/plat-fetch.js.map +1 -0
- package/dist/client-side-server/plat-service-worker-client.d.ts +30 -0
- package/dist/client-side-server/plat-service-worker-client.d.ts.map +1 -0
- package/dist/client-side-server/plat-service-worker-client.js +141 -0
- package/dist/client-side-server/plat-service-worker-client.js.map +1 -0
- package/dist/client-side-server/plat-service-worker.d.ts +35 -0
- package/dist/client-side-server/plat-service-worker.d.ts.map +1 -0
- package/dist/client-side-server/plat-service-worker.js +292 -0
- package/dist/client-side-server/plat-service-worker.js.map +1 -0
- package/dist/client-side-server/protocol.d.ts +68 -1
- package/dist/client-side-server/protocol.d.ts.map +1 -1
- package/dist/client-side-server/protocol.js +7 -0
- package/dist/client-side-server/protocol.js.map +1 -1
- package/dist/client-side-server/runtime.d.ts +16 -1
- package/dist/client-side-server/runtime.d.ts.map +1 -1
- package/dist/client-side-server/runtime.js +41 -13
- package/dist/client-side-server/runtime.js.map +1 -1
- package/dist/client-side-server/server.d.ts +34 -1
- package/dist/client-side-server/server.d.ts.map +1 -1
- package/dist/client-side-server/server.js +171 -7
- package/dist/client-side-server/server.js.map +1 -1
- package/dist/client-side-server/worker-pool.d.ts +20 -0
- package/dist/client-side-server/worker-pool.d.ts.map +1 -0
- package/dist/client-side-server/worker-pool.js +336 -0
- package/dist/client-side-server/worker-pool.js.map +1 -0
- package/dist/generated/python-browser-sources.js +4 -4
- package/dist/generated/python-browser-sources.js.map +1 -1
- package/dist/server/authority-server.d.ts +1 -1
- package/dist/server/authority-server.d.ts.map +1 -1
- package/dist/server/authority-server.js +27 -14
- package/dist/server/authority-server.js.map +1 -1
- package/dist/server/core.d.ts +8 -0
- package/dist/server/core.d.ts.map +1 -1
- package/dist/server/core.js +21 -0
- package/dist/server/core.js.map +1 -1
- package/dist/server/server.d.ts +4 -0
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +81 -2
- package/dist/server/server.js.map +1 -1
- package/dist/static/file-response.d.ts +42 -0
- package/dist/static/file-response.d.ts.map +1 -0
- package/dist/static/file-response.js +57 -0
- package/dist/static/file-response.js.map +1 -0
- package/dist/static/glob-match.d.ts +16 -0
- package/dist/static/glob-match.d.ts.map +1 -0
- package/dist/static/glob-match.js +48 -0
- package/dist/static/glob-match.js.map +1 -0
- package/dist/static/index.d.ts +9 -0
- package/dist/static/index.d.ts.map +1 -0
- package/dist/static/index.js +6 -0
- package/dist/static/index.js.map +1 -0
- package/dist/static/mime-types.d.ts +6 -0
- package/dist/static/mime-types.d.ts.map +1 -0
- package/dist/static/mime-types.js +74 -0
- package/dist/static/mime-types.js.map +1 -0
- package/dist/static/static-folder.d.ts +69 -0
- package/dist/static/static-folder.d.ts.map +1 -0
- package/dist/static/static-folder.js +206 -0
- package/dist/static/static-folder.js.map +1 -0
- package/dist/static/virtual-file-system.d.ts +45 -0
- package/dist/static/virtual-file-system.d.ts.map +1 -0
- package/dist/static/virtual-file-system.js +100 -0
- package/dist/static/virtual-file-system.js.map +1 -0
- 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;
|
|
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":"
|
|
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,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/client-side-server/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
14
|
-
|
|
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(
|
|
24
|
+
return transpileMultipleFiles(normalized, ts, ep);
|
|
23
25
|
};
|
|
24
26
|
const defaultAnalyze = (src, ep) => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
const normalized = normalizeClientSideSourceImports(src);
|
|
28
|
+
if (typeof normalized === 'string') {
|
|
29
|
+
return analyzeClientSideServerSource(ts, normalized, { undecoratedMode });
|
|
27
30
|
}
|
|
28
|
-
return analyzeClientSideServerMultipleFiles(ts,
|
|
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(
|
|
57
|
-
: Promise.resolve(transpileSource(
|
|
60
|
+
? options.transpile(normalizedSource, options.sourceEntryPoint)
|
|
61
|
+
: Promise.resolve(transpileSource(normalizedSource, options.sourceEntryPoint)));
|
|
58
62
|
const analysis = await (options.analyzeSource
|
|
59
|
-
? options.analyzeSource(
|
|
60
|
-
: Promise.resolve(typeof
|
|
61
|
-
? analyzeClientSideServerSource(ts,
|
|
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,
|
|
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;
|