@statewalker/webrun-http-browser 0.3.3 → 0.4.2
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 +406 -51
- package/demo/demo-1.html +109 -194
- package/demo/demo-2.html +118 -299
- package/dist/core/data-calls.d.ts +5 -0
- package/dist/core/data-calls.d.ts.map +1 -0
- package/dist/core/data-channels.d.ts +17 -0
- package/dist/core/data-channels.d.ts.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/message-target.d.ts +2 -0
- package/dist/core/message-target.d.ts.map +1 -0
- package/dist/core/registry.d.ts +18 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/http/http-send-recieve.d.ts +36 -0
- package/dist/http/http-send-recieve.d.ts.map +1 -0
- package/dist/http/index.d.ts +4 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2670 -807
- package/dist/relay/index-sw.d.ts +7 -0
- package/dist/relay/index-sw.d.ts.map +1 -0
- package/dist/relay/index.d.ts +69 -0
- package/dist/relay/index.d.ts.map +1 -0
- package/dist/relay/split-service-url.d.ts +13 -0
- package/dist/relay/split-service-url.d.ts.map +1 -0
- package/dist/relay-sw.d.ts +2 -0
- package/dist/relay-sw.d.ts.map +1 -0
- package/dist/relay-sw.js +1660 -0
- package/dist/sw/http-sw-dispatcher.d.ts +28 -0
- package/dist/sw/http-sw-dispatcher.d.ts.map +1 -0
- package/dist/sw/index.d.ts +3 -0
- package/dist/sw/index.d.ts.map +1 -0
- package/dist/sw/sw-dispatcher.d.ts +74 -0
- package/dist/sw/sw-dispatcher.d.ts.map +1 -0
- package/dist/sw-worker.d.ts +2 -0
- package/dist/sw-worker.d.ts.map +1 -0
- package/dist/sw-worker.js +1597 -0
- package/dist/sw.d.ts +2 -0
- package/dist/sw.d.ts.map +1 -0
- package/dist/sw.js +1883 -0
- package/package.json +51 -37
- package/public/index.html +61 -97
- package/public/index.js +7 -4
- package/public/sw-worker.js +4 -0
- package/public-relay/heartbeat.js +4 -3
- package/public-relay/relay-sw.js +4 -6
- package/public-relay/relay.html +16 -11
- package/src/core/data-calls.ts +46 -0
- package/src/core/data-channels.ts +262 -0
- package/src/core/index.ts +9 -0
- package/src/core/message-target.ts +8 -0
- package/src/core/registry.ts +54 -0
- package/src/http/http-send-recieve.ts +94 -0
- package/src/http/index.ts +7 -0
- package/src/index.ts +3 -0
- package/src/relay/index-sw.ts +145 -0
- package/src/relay/index.ts +261 -0
- package/src/relay/split-service-url.ts +30 -0
- package/src/relay-sw.ts +7 -0
- package/src/sw/http-sw-dispatcher.ts +122 -0
- package/src/sw/index.ts +2 -0
- package/src/sw/sw-dispatcher.ts +332 -0
- package/src/sw-worker.ts +7 -0
- package/src/sw.ts +1 -0
- package/CHANGELOG.md +0 -1
- package/LICENSE +0 -21
- package/demo/demo-2 copy.html +0 -598
- package/demo/demo-3.html +0 -167
- package/dist/index-sw-umd.js +0 -798
- package/dist/index-sw-umd.min.js +0 -2
- package/dist/index-sw.js +0 -791
- package/dist/index-sw.min.js +0 -2
- package/dist/index-umd.js +0 -853
- package/dist/index-umd.min.js +0 -2
- package/dist/index.min.js +0 -2
- package/index.js +0 -1
- package/src/core/data-calls.js +0 -36
- package/src/core/data-channels.js +0 -192
- package/src/core/data-send-recieve.js +0 -28
- package/src/core/errors.js +0 -13
- package/src/core/index.js +0 -4
- package/src/http/HttpError.js +0 -59
- package/src/http/http-send-recieve.js +0 -40
- package/src/http/http-stubs.js +0 -135
- package/src/http/index.js +0 -3
- package/src/http/readable-streams.js +0 -33
- package/src/index.js +0 -7
- package/src/relay/index-sw.js +0 -216
- package/src/relay/index.js +0 -263
- package/src/relay/splitServiceUrl.js +0 -24
- package/src/sw/http-sw-dispatcher.js +0 -128
- package/src/sw/sw-dispatcher.js +0 -264
package/demo/demo-2.html
CHANGED
|
@@ -1,318 +1,137 @@
|
|
|
1
|
-
<!DOCTYPE
|
|
2
|
-
<html>
|
|
3
|
-
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
height: var(--tree-connector-height);
|
|
32
|
-
max-height: 100%;
|
|
33
|
-
margin-inline-start: calc(0em - var(--tree-line-width));
|
|
34
|
-
border-bottom: var(--tree-line-width) solid var(--tree-line-color);
|
|
35
|
-
border-inline-start: var(--tree-line-width) solid var(--tree-line-color);
|
|
36
|
-
border-end-start-radius: var(--tree-connector-radius);
|
|
37
|
-
}
|
|
38
|
-
.tree .tree-node:last-child {
|
|
39
|
-
border-inline-start: var(--tree-line-width) solid transparent;
|
|
40
|
-
}
|
|
41
|
-
.tree .tree-node > .tree-node-content {
|
|
42
|
-
position: relative;
|
|
43
|
-
padding-inline-start: var(--tree-content-padding);
|
|
44
|
-
}
|
|
45
|
-
.tree .tree-node > .tree-node-content:before {
|
|
46
|
-
content: "";
|
|
47
|
-
position: absolute;
|
|
48
|
-
top: var(--tree-connector-height);
|
|
49
|
-
left: 0;
|
|
50
|
-
right: 0;
|
|
51
|
-
width: var(--tree-line-width);
|
|
52
|
-
height: calc(100% - var(--tree-connector-height));
|
|
53
|
-
border-inline-start: var(--tree-line-width) solid var(--tree-line-color);
|
|
54
|
-
}
|
|
55
|
-
.tree .tree-node > .tree-node-content:last-child:before {
|
|
56
|
-
border-inline-start: var(--tree-line-width) solid transparent;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.tree {
|
|
60
|
-
--tree-content-padding: 0.1em;
|
|
61
|
-
padding: 1em 1em 1em 2em;
|
|
62
|
-
}
|
|
63
|
-
.tree .tree-node > .tree-node-content {
|
|
64
|
-
display: flex;
|
|
65
|
-
gap: 0.2em;
|
|
66
|
-
}
|
|
67
|
-
.tree .tree-node > .tree-node-content > .icon-dir,
|
|
68
|
-
.tree .tree-node > .tree-node-content > .icon-file {
|
|
69
|
-
display: block;
|
|
70
|
-
width: 1.5em;
|
|
71
|
-
color: gray;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/* */
|
|
75
|
-
.files-panel {
|
|
76
|
-
display: flex;
|
|
77
|
-
align-items: stretch;
|
|
78
|
-
align-content: stretch;
|
|
79
|
-
justify-content: stretch;
|
|
80
|
-
min-height: 25em;
|
|
81
|
-
gap: 1em;
|
|
82
|
-
width: 100%;
|
|
83
|
-
}
|
|
84
|
-
.files-panel .files-explorer {
|
|
85
|
-
min-width: 15em;
|
|
86
|
-
border: 1px solid #eee;
|
|
87
|
-
flex: none;
|
|
88
|
-
}
|
|
89
|
-
.files-panel .files-preview {
|
|
90
|
-
flex: auto;
|
|
91
|
-
border: 1px solid red;
|
|
92
|
-
}
|
|
93
|
-
.files-panel .files-preview iframe {
|
|
94
|
-
width: 100%;
|
|
95
|
-
height: calc(100% - 1em);
|
|
96
|
-
border: none;
|
|
97
|
-
outline: none;
|
|
98
|
-
}
|
|
99
|
-
</style>
|
|
100
|
-
</head>
|
|
101
|
-
|
|
102
|
-
<body>
|
|
103
|
-
<h3>Local File System</h3>
|
|
104
|
-
<p>
|
|
105
|
-
This page allows you to get read/write access to your local file system and develop the whole site directly in the browser without an HTTP server.
|
|
106
|
-
</p>
|
|
107
|
-
<div>
|
|
108
|
-
<button id="fs-open">Open Workspace</button>
|
|
109
|
-
<button id="fs-redraw-tree" style="display: none;">Redraw Files Tree</button>
|
|
110
|
-
</div>
|
|
111
|
-
<div class="files-panel">
|
|
112
|
-
<div class="files-explorer">
|
|
113
|
-
Files Tree:
|
|
114
|
-
<div id="fs-view"></div>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>webrun-http-browser — local file server demo (relay)</title>
|
|
7
|
+
<style>
|
|
8
|
+
body { font-family: system-ui, sans-serif; margin: 2rem; max-width: 60rem; }
|
|
9
|
+
.panel { display: flex; gap: 1rem; min-height: 22rem; }
|
|
10
|
+
.files { width: 16rem; border: 1px solid #e5e5e5; padding: 0.5rem; overflow: auto; }
|
|
11
|
+
.preview { flex: 1; border: 1px solid #e5e5e5; }
|
|
12
|
+
iframe { width: 100%; height: 100%; border: none; }
|
|
13
|
+
.tree-node { padding-left: 1rem; }
|
|
14
|
+
.entry { display: flex; gap: 0.25rem; cursor: pointer; font-family: monospace; }
|
|
15
|
+
</style>
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
<h1>Local disk → in-browser file server</h1>
|
|
19
|
+
<p>
|
|
20
|
+
Click <strong>Open folder</strong> and pick a directory. A relay
|
|
21
|
+
ServiceWorker will serve the folder's contents from an in-browser URL
|
|
22
|
+
rooted at <code>~FS/</code>.
|
|
23
|
+
</p>
|
|
24
|
+
<button type="button" id="open">Open folder</button>
|
|
25
|
+
<button type="button" id="reload" style="display: none;">Reload tree</button>
|
|
26
|
+
<div class="panel">
|
|
27
|
+
<div class="files" id="files"></div>
|
|
28
|
+
<div class="preview">
|
|
29
|
+
<iframe title="File preview" id="preview" name="preview" src=""></iframe>
|
|
30
|
+
</div>
|
|
115
31
|
</div>
|
|
116
|
-
<div class="files-preview">
|
|
117
|
-
Files Preview:
|
|
118
|
-
<iframe id="fs-preview" name="fs-preview" width="100%" height="100%" src=""></iframe>
|
|
119
|
-
</div>
|
|
120
|
-
</div>
|
|
121
32
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
import { Hono } from "https://unpkg.com/hono@3.5/dist/index.js";
|
|
125
|
-
import mime from "https://esm.sh/mime-types";
|
|
126
|
-
import {
|
|
127
|
-
BrowserFilesApi,
|
|
128
|
-
verifyPermission,
|
|
129
|
-
} from "https://unpkg.com/@statewalker/webrun-files@0.2.0/dist/index.js";
|
|
33
|
+
<script type="module">
|
|
34
|
+
import * as WebRunHttp from "../dist/index.js";
|
|
130
35
|
|
|
131
|
-
|
|
132
|
-
|
|
36
|
+
const openBtn = document.querySelector("#open");
|
|
37
|
+
const reloadBtn = document.querySelector("#reload");
|
|
38
|
+
const filesView = document.querySelector("#files");
|
|
133
39
|
|
|
134
|
-
const openBtn = document.querySelector("#fs-open");
|
|
135
|
-
const refreshBtn = document.querySelector("#fs-redraw-tree");
|
|
136
|
-
let close;
|
|
137
40
|
openBtn.addEventListener("click", async () => {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
// This dispatcher get the requested path, read the
|
|
143
|
-
// file content and return it to the caller with
|
|
144
|
-
// a correct mime type:
|
|
145
|
-
const router = await newFilesRouter(fs);
|
|
146
|
-
|
|
147
|
-
// Create an HTTP Server with the specified name.
|
|
148
|
-
// It uses the given Hono router to dispatch requests
|
|
149
|
-
// between endpoints.
|
|
150
|
-
const SERVICE_KEY = "FS"
|
|
151
|
-
const serviceBaseUrl = await startHttpService({
|
|
152
|
-
serviceKey : SERVICE_KEY,
|
|
153
|
-
router
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
openBtn.style.display = "none";
|
|
157
|
-
refreshBtn.style.display = "block";
|
|
158
|
-
const target = "fs-preview";
|
|
159
|
-
const filesRenderOptions = {
|
|
160
|
-
fs,
|
|
161
|
-
baseUrl : serviceBaseUrl,
|
|
162
|
-
target
|
|
163
|
-
};
|
|
164
|
-
renderFilesExplorer(filesRenderOptions);
|
|
165
|
-
refreshBtn.addEventListener("click", (event) => {
|
|
166
|
-
renderFilesExplorer(filesRenderOptions);
|
|
167
|
-
});
|
|
168
|
-
})
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function newFilesRouter(fs) {
|
|
172
|
-
const router = new Hono();
|
|
173
|
-
router.get("/*", async (context) => {
|
|
174
|
-
let { url, path } = context.req;
|
|
175
|
-
path = path.replace(/#.*$/, "");
|
|
176
|
-
if (path.match(/\/$/)) {
|
|
177
|
-
path = path + "index.html";
|
|
178
|
-
}
|
|
179
|
-
const fileInfo = await fs.stats(path);
|
|
180
|
-
if (!fileInfo || (fileInfo.kind !== "file")) {
|
|
181
|
-
return context.notFound();
|
|
41
|
+
const rootHandle = await window.showDirectoryPicker();
|
|
42
|
+
const permission = await rootHandle.requestPermission?.({ mode: "read" });
|
|
43
|
+
if (permission && permission !== "granted") {
|
|
44
|
+
throw new Error("Permission denied");
|
|
182
45
|
}
|
|
183
|
-
const content = await fs.read(fileInfo);
|
|
184
|
-
const responseBody = await WebRunHttp.toReadableStream(content);
|
|
185
|
-
return new Response(responseBody, {
|
|
186
|
-
status: 200,
|
|
187
|
-
headers: {
|
|
188
|
-
"Content-Type": fileInfo.type,
|
|
189
|
-
},
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
return router;
|
|
193
|
-
}
|
|
194
46
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
47
|
+
const SERVICE_KEY = "FS";
|
|
48
|
+
const connection = await WebRunHttp.newRemoteRelayChannel();
|
|
49
|
+
const serviceBaseUrl = `${connection.baseUrl}~${SERVICE_KEY}`;
|
|
50
|
+
|
|
51
|
+
await WebRunHttp.initHttpService(
|
|
52
|
+
async (request) => {
|
|
53
|
+
const url = new URL(request.url);
|
|
54
|
+
const rel = url.pathname.substring(
|
|
55
|
+
new URL(serviceBaseUrl).pathname.length,
|
|
56
|
+
);
|
|
57
|
+
const path = rel.replace(/^\/+/, "").replace(/\/$/, "");
|
|
58
|
+
try {
|
|
59
|
+
const file = await resolveFile(rootHandle, path);
|
|
60
|
+
if (!file) return new Response(null, { status: 404 });
|
|
61
|
+
const body = await file.stream();
|
|
62
|
+
return new Response(body, {
|
|
63
|
+
headers: { "Content-Type": file.type || guessMime(file.name) },
|
|
64
|
+
});
|
|
65
|
+
} catch (_err) {
|
|
66
|
+
return new Response(null, { status: 404 });
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
{ key: SERVICE_KEY, port: connection.port },
|
|
70
|
+
);
|
|
219
71
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
72
|
+
openBtn.style.display = "none";
|
|
73
|
+
reloadBtn.style.display = "";
|
|
74
|
+
reloadBtn.addEventListener("click", () => renderTree(rootHandle, serviceBaseUrl));
|
|
75
|
+
renderTree(rootHandle, serviceBaseUrl);
|
|
224
76
|
});
|
|
225
77
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
async function renderFilesExplorer({ fs, baseUrl, target = "_blank" }) {
|
|
232
|
-
const container = document.querySelector("#fs-view");
|
|
233
|
-
container.innerHTML = "";
|
|
234
|
-
container.classList.add("tree");
|
|
235
|
-
for await (let file of fs.list("/", { recursive: false })) {
|
|
236
|
-
renderFile({
|
|
237
|
-
fs,
|
|
238
|
-
file,
|
|
239
|
-
baseUrl,
|
|
240
|
-
container,
|
|
241
|
-
target
|
|
242
|
-
})
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
function renderFile({
|
|
247
|
-
fs,
|
|
248
|
-
file,
|
|
249
|
-
container,
|
|
250
|
-
baseUrl,
|
|
251
|
-
target
|
|
252
|
-
}) {
|
|
253
|
-
let path = file.path;
|
|
254
|
-
const isDirectory = file.kind === "directory";
|
|
255
|
-
if (isDirectory) {
|
|
256
|
-
if (path[path.length - 1] !== '/') {
|
|
257
|
-
path += '/';
|
|
78
|
+
async function resolveFile(root, path) {
|
|
79
|
+
const parts = path.split("/").filter(Boolean);
|
|
80
|
+
let dir = root;
|
|
81
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
82
|
+
dir = await dir.getDirectoryHandle(parts[i]);
|
|
258
83
|
}
|
|
84
|
+
const handle = await dir.getFileHandle(parts[parts.length - 1]);
|
|
85
|
+
return handle.getFile();
|
|
259
86
|
}
|
|
260
87
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
iconElm.classList.add(iconCls);
|
|
266
|
-
iconElm.innerText = isDirectory ? 'dir' : 'file';
|
|
267
|
-
|
|
268
|
-
const linkElm = newElement("file-name", treeNodeContentElm, "a");
|
|
269
|
-
const fileUrl = baseUrl + path;
|
|
270
|
-
linkElm.setAttribute("href", fileUrl);
|
|
271
|
-
linkElm.setAttribute("target", target);
|
|
272
|
-
linkElm.innerText = file.name;
|
|
88
|
+
async function renderTree(rootHandle, baseUrl) {
|
|
89
|
+
filesView.innerHTML = "";
|
|
90
|
+
await renderDir(rootHandle, "", baseUrl, filesView);
|
|
91
|
+
}
|
|
273
92
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
93
|
+
async function renderDir(handle, prefix, baseUrl, parent) {
|
|
94
|
+
for await (const [name, entry] of handle.entries()) {
|
|
95
|
+
const node = document.createElement("div");
|
|
96
|
+
node.className = "tree-node";
|
|
97
|
+
const row = document.createElement("div");
|
|
98
|
+
row.className = "entry";
|
|
99
|
+
const path = `${prefix}${name}`;
|
|
100
|
+
if (entry.kind === "directory") {
|
|
101
|
+
row.textContent = `📁 ${name}`;
|
|
102
|
+
let expanded = false;
|
|
103
|
+
row.addEventListener("click", async () => {
|
|
104
|
+
expanded = !expanded;
|
|
105
|
+
if (expanded) await renderDir(entry, `${path}/`, baseUrl, node);
|
|
106
|
+
else for (const c of [...node.children].slice(1)) node.removeChild(c);
|
|
107
|
+
});
|
|
290
108
|
} else {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
elm = next;
|
|
297
|
-
}
|
|
109
|
+
const link = document.createElement("a");
|
|
110
|
+
link.href = `${baseUrl}/${path}`;
|
|
111
|
+
link.target = "preview";
|
|
112
|
+
link.textContent = `📄 ${name}`;
|
|
113
|
+
row.appendChild(link);
|
|
298
114
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
function newElement(className, parent, name = "div") {
|
|
303
|
-
const div = document.createElement(name);
|
|
304
|
-
className
|
|
305
|
-
.split(/\\s+/)
|
|
306
|
-
.map(s => s.trim())
|
|
307
|
-
.forEach(cls => div.classList.add(cls));
|
|
308
|
-
if (parent) {
|
|
309
|
-
parent.appendChild(div);
|
|
115
|
+
node.appendChild(row);
|
|
116
|
+
parent.appendChild(node);
|
|
310
117
|
}
|
|
311
|
-
return div;
|
|
312
118
|
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
</script>
|
|
316
|
-
</body>
|
|
317
119
|
|
|
318
|
-
|
|
120
|
+
function guessMime(name) {
|
|
121
|
+
const ext = name.toLowerCase().split(".").pop();
|
|
122
|
+
return ({
|
|
123
|
+
html: "text/html",
|
|
124
|
+
css: "text/css",
|
|
125
|
+
js: "text/javascript",
|
|
126
|
+
json: "application/json",
|
|
127
|
+
png: "image/png",
|
|
128
|
+
jpg: "image/jpeg",
|
|
129
|
+
jpeg: "image/jpeg",
|
|
130
|
+
svg: "image/svg+xml",
|
|
131
|
+
txt: "text/plain",
|
|
132
|
+
md: "text/markdown",
|
|
133
|
+
}[ext] ?? "application/octet-stream");
|
|
134
|
+
}
|
|
135
|
+
</script>
|
|
136
|
+
</body>
|
|
137
|
+
</html>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MessageSink, MessageSource } from "./message-target.js";
|
|
2
|
+
export type ChannelCallHandler = (event: MessageEvent, params: unknown, ...transfers: MessagePort[]) => unknown;
|
|
3
|
+
export declare function callChannel<T = unknown>(target: MessageSink, callType: string, params: unknown, ...transfers: Transferable[]): Promise<T>;
|
|
4
|
+
export declare function handleChannelCalls(target: MessageSource, callType: string, handler: ChannelCallHandler): () => void;
|
|
5
|
+
//# sourceMappingURL=data-calls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-calls.d.ts","sourceRoot":"","sources":["../../src/core/data-calls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEtE,MAAM,MAAM,kBAAkB,GAAG,CAC/B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,OAAO,EACf,GAAG,SAAS,EAAE,WAAW,EAAE,KACxB,OAAO,CAAC;AAEb,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrC,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,GAAG,SAAS,EAAE,YAAY,EAAE,GAC3B,OAAO,CAAC,CAAC,CAAC,CAUZ;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,GAC1B,MAAM,IAAI,CAeZ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MessageTarget } from "./message-target.js";
|
|
2
|
+
export interface InvocationChannel {
|
|
3
|
+
start(): Promise<void>;
|
|
4
|
+
close(): Promise<void>;
|
|
5
|
+
invoke<T = unknown>(request?: unknown, ...transfers: Transferable[]): Promise<T>;
|
|
6
|
+
}
|
|
7
|
+
export interface NewInvocationChannelOptions {
|
|
8
|
+
port: MessageTarget;
|
|
9
|
+
handler?: (request: unknown, ...ports: MessagePort[]) => unknown;
|
|
10
|
+
onError?: (error: unknown) => void;
|
|
11
|
+
newCallId?: () => number;
|
|
12
|
+
}
|
|
13
|
+
export declare function newInvokationChannel({ port, handler, onError, newCallId, }: NewInvocationChannelOptions): InvocationChannel;
|
|
14
|
+
export declare function sendStream<T>(communicationPort: MessageTarget, input: AsyncIterable<T>, params?: Record<string, unknown>): AsyncGenerator<T, void, unknown>;
|
|
15
|
+
export type StreamHandler<T> = (input: AsyncIterable<T>, params: Record<string, unknown>) => AsyncIterable<T> | Promise<AsyncIterable<T>>;
|
|
16
|
+
export declare function handleStreams<T>(communicationPort: MessageTarget, handler: StreamHandler<T>): () => void;
|
|
17
|
+
//# sourceMappingURL=data-channels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-channels.d.ts","sourceRoot":"","sources":["../../src/core/data-channels.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAqBzD,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAClF;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC;IACjE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,OAEC,EACD,OAAuB,EACvB,SAAuC,GACxC,EAAE,2BAA2B,GAAG,iBAAiB,CAoEjD;AAED,wBAAuB,UAAU,CAAC,CAAC,EACjC,iBAAiB,EAAE,aAAa,EAChC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAmBlC;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAC7B,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAElD,wBAAgB,aAAa,CAAC,CAAC,EAC7B,iBAAiB,EAAE,aAAa,EAChC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,MAAM,IAAI,CAqBZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAGA,cAAc,6BAA6B,CAAC;AAE5C,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-target.d.ts","sourceRoot":"","sources":["../../src/core/message-target.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type CleanupAction = () => unknown;
|
|
2
|
+
interface CleanupFn {
|
|
3
|
+
(skip?: boolean): unknown;
|
|
4
|
+
action: CleanupAction;
|
|
5
|
+
}
|
|
6
|
+
export interface Registry {
|
|
7
|
+
register(action: CleanupAction): CleanupFn;
|
|
8
|
+
unregister(action: CleanupAction): void;
|
|
9
|
+
clear(): void;
|
|
10
|
+
}
|
|
11
|
+
export type NewRegistryResult = [
|
|
12
|
+
register: Registry["register"],
|
|
13
|
+
clear: Registry["clear"],
|
|
14
|
+
unregister: Registry["unregister"]
|
|
15
|
+
] & Registry;
|
|
16
|
+
export declare function newRegistry(onError?: (error: unknown) => void): NewRegistryResult;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;AAE1C,UAAU,SAAS;IACjB,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAC3C,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC;IAC9B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;IACxB,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC;CACnC,GACC,QAAQ,CAAC;AAEX,wBAAgB,WAAW,CAAC,OAAO,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAoB,GAAG,iBAAiB,CAiChG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type HttpHandler } from "@statewalker/webrun-http-streams";
|
|
2
|
+
import type { MessageTarget } from "../core/message-target.js";
|
|
3
|
+
/**
|
|
4
|
+
* Serve an `HttpHandler` over a `MessageTarget`, using this package's own
|
|
5
|
+
* `handleStreams` transport.
|
|
6
|
+
*
|
|
7
|
+
* @deprecated Prefer the port stack in `@statewalker/webrun-rpc`: open a port
|
|
8
|
+
* (`multiplexPort` over one pipe, or `transferPortMux` where the platform can
|
|
9
|
+
* transfer a real `MessagePort`), turn it into a `Duplex` with
|
|
10
|
+
* `serveDuplexOverPort`, and serve HTTP on that with
|
|
11
|
+
* `httpServe(handler, options)` from `@statewalker/webrun-http-streams`.
|
|
12
|
+
*
|
|
13
|
+
* That path has backpressure; **this one does not.** `sendStream`'s chunk
|
|
14
|
+
* sender discards the promise it is given, so a fast producer over a slow
|
|
15
|
+
* consumer accumulates without bound. It also has no per-stream timeout and no
|
|
16
|
+
* chunking to a transport's message ceiling.
|
|
17
|
+
*
|
|
18
|
+
* Kept for existing ServiceWorker setups built on the `MessageTarget` surface.
|
|
19
|
+
*/
|
|
20
|
+
export declare function handleHttpRequests(communicationPort: MessageTarget, handler: HttpHandler): () => void;
|
|
21
|
+
/**
|
|
22
|
+
* Ship a `Request` over a `MessageTarget` and await the `Response`, using this
|
|
23
|
+
* package's own `sendStream` transport.
|
|
24
|
+
*
|
|
25
|
+
* @deprecated Prefer the port stack in `@statewalker/webrun-rpc`: open a port
|
|
26
|
+
* (`multiplexPort` over one pipe, or `transferPortMux` where the platform can
|
|
27
|
+
* transfer a real `MessagePort`), turn it into a `Duplex` with
|
|
28
|
+
* `duplexOverPort`, and drive HTTP over it with `httpFetch` from
|
|
29
|
+
* `@statewalker/webrun-http-streams`.
|
|
30
|
+
*
|
|
31
|
+
* Same caveat as {@link handleHttpRequests}: the transport underneath this
|
|
32
|
+
* helper has no backpressure, no per-stream timeout, and no chunking to a
|
|
33
|
+
* transport's message ceiling. Kept for existing ServiceWorker setups.
|
|
34
|
+
*/
|
|
35
|
+
export declare function sendHttpRequest(communicationPort: MessageTarget, request: Request): Promise<Response>;
|
|
36
|
+
//# sourceMappingURL=http-send-recieve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-send-recieve.d.ts","sourceRoot":"","sources":["../../src/http/http-send-recieve.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAMjB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA+B/D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAChC,iBAAiB,EAAE,aAAa,EAChC,OAAO,EAAE,WAAW,GACnB,MAAM,IAAI,CAOZ;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,iBAAiB,EAAE,aAAa,EAChC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CAOnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAIA,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|