@swiftbrowser/native 0.18.3 → 0.21.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 +53 -11
- package/bin/swiftbrowser-native.mjs +47 -0
- package/dist/blob.d.ts +85 -11
- package/dist/blob.d.ts.map +1 -1
- package/dist/blob.js +184 -34
- package/dist/blob.js.map +1 -1
- package/dist/bridge.d.ts +66 -8
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.js.map +1 -1
- package/dist/encoding.d.ts +13 -0
- package/dist/encoding.d.ts.map +1 -1
- package/dist/encoding.js +24 -0
- package/dist/encoding.js.map +1 -1
- package/dist/fetch.d.ts +27 -13
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +117 -45
- package/dist/fetch.js.map +1 -1
- package/dist/hostRequests.d.ts +24 -6
- package/dist/hostRequests.d.ts.map +1 -1
- package/dist/hostRequests.js +108 -15
- package/dist/hostRequests.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/ios.d.ts +79 -0
- package/dist/ios.d.ts.map +1 -0
- package/dist/ios.js +181 -0
- package/dist/ios.js.map +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +16 -7
- package/dist/runtime.js.map +1 -1
- package/dist/subtle.d.ts +1 -1
- package/dist/subtle.d.ts.map +1 -1
- package/dist/subtle.js +9 -5
- package/dist/subtle.js.map +1 -1
- package/dist/webSocket.d.ts +12 -5
- package/dist/webSocket.d.ts.map +1 -1
- package/dist/webSocket.js +37 -11
- package/dist/webSocket.js.map +1 -1
- package/package.json +7 -3
- package/src/blob.ts +215 -34
- package/src/bridge.ts +56 -8
- package/src/encoding.ts +22 -0
- package/src/fetch.ts +111 -48
- package/src/hostRequests.ts +129 -22
- package/src/index.ts +1 -2
- package/src/ios.ts +253 -0
- package/src/runtime.ts +23 -8
- package/src/subtle.ts +10 -6
- package/src/webSocket.ts +37 -13
- package/swift/Packages/SwiftBrowserDSP/Package.swift +31 -0
- package/swift/Packages/SwiftBrowserDSP/README.md +42 -0
- package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSP/ProgramNode.swift +306 -0
- package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSP/ScopeView.swift +79 -0
- package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSPCore/Machine.swift +1561 -0
- package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSPCore/Program.swift +483 -0
- package/swift/Packages/SwiftBrowserLocalModel/Package.swift +35 -0
- package/swift/Packages/SwiftBrowserLocalModel/README.md +66 -0
- package/swift/Packages/SwiftBrowserLocalModel/Sources/SwiftBrowserLocalModel/LlamaEngine.swift +223 -0
- package/swift/Packages/SwiftBrowserLocalModel/Sources/SwiftBrowserLocalModel/LocalLanguageModel.swift +409 -0
- package/swift/Packages/SwiftBrowserShader/Package.swift +31 -0
- package/swift/Packages/SwiftBrowserShader/README.md +45 -0
- package/swift/Packages/SwiftBrowserShader/Sources/SwiftBrowserShader/ShaderRenderer.swift +103 -0
- package/swift/Packages/SwiftBrowserShader/Sources/SwiftBrowserShader/ShaderView.swift +168 -0
- package/swift/Packages/SwiftBrowserShader/Sources/SwiftBrowserShaderCore/ShaderProps.swift +120 -0
- package/swift/Sources/SwiftBrowserNative/Host/AudioEngineBridge.swift +921 -0
- package/swift/Sources/SwiftBrowserNative/Host/AudioEngineNodes.swift +70 -0
- package/swift/Sources/SwiftBrowserNative/Host/BodyStream.swift +166 -0
- package/swift/Sources/SwiftBrowserNative/Host/FilesBridge.swift +144 -10
- package/swift/Sources/SwiftBrowserNative/Host/HostBridge.swift +151 -27
- package/swift/Sources/SwiftBrowserNative/Host/HostRequestBridge.swift +139 -40
- package/swift/Sources/SwiftBrowserNative/Host/JSHost.swift +116 -0
- package/swift/Sources/SwiftBrowserNative/Host/JavaScriptCoreHost.swift +141 -2
- package/swift/Sources/SwiftBrowserNative/Host/LanguageModelBridge.swift +511 -0
- package/swift/Sources/SwiftBrowserNative/Host/LanguageModelProvider.swift +195 -0
- package/swift/Sources/SwiftBrowserNative/Host/WebSocketBridge.swift +24 -11
- package/swift/Sources/SwiftBrowserNative/Host/WorkerHost.swift +3 -2
- package/swift/Sources/SwiftBrowserNative/Runtime/NativeFunctions.swift +1 -1
- package/swift/Sources/SwiftBrowserNative/Runtime/ViewRegistry.swift +57 -0
- package/swift/Sources/SwiftBrowserNative/Views/ElementView.swift +12 -7
- package/swift/Sources/SwiftBrowserNative/Views/Kinds/Controls.swift +18 -1
- package/swift/Sources/SwiftBrowserNative/Views/Kinds/Drawing.swift +378 -0
- package/swift/Sources/SwiftBrowserNative/Views/Kinds/Lists.swift +41 -1
- package/swift/Sources/SwiftBrowserNative/Views/Kinds/More.swift +88 -17
- package/swift/Sources/SwiftBrowserNative/Views/Kinds/Navigation.swift +87 -21
- package/swift/Sources/SwiftBrowserNative/Views/Kinds/PinchTracker.swift +200 -0
- package/swift/Sources/SwiftBrowserNative/Views/Kinds/PopTap.swift +103 -0
- package/swift/Sources/SwiftBrowserNative/Views/Kinds/Stacks.swift +3 -2
- package/swift/Sources/SwiftBrowserNative/Views/StyleModifier.swift +146 -0
- package/swift/Sources/SwiftBrowserProtocol/Drawing.swift +306 -0
- package/swift/Sources/SwiftBrowserProtocol/Props.swift +31 -2
- package/swift/Sources/SwiftBrowserProtocol/RendererEvent.swift +24 -3
- package/swift/Sources/SwiftBrowserProtocol/Style.swift +87 -0
- package/swift/Sources/SwiftBrowserTree/OpTree.swift +25 -0
- package/wasm/SwiftBrowserNative.wasm +2 -2
- package/dist/native.d.ts +0 -19
- package/dist/native.d.ts.map +0 -1
- package/dist/native.js +0 -17
- package/dist/native.js.map +0 -1
- package/src/native.ts +0 -35
- package/swift/Sources/SwiftBrowserNative/Runtime/NativeRegistry.swift +0 -53
package/dist/fetch.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `fetch`, `Headers`, `Request`, `Response` and `AbortController` over the
|
|
3
|
-
* bridge's `fetch` primitive (`URLSession` on the Swift side).
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* bridge's `fetch` primitive (`URLSession` on the Swift side). A request
|
|
4
|
+
* body is a list of parts (blob.ts): bytes here, or ranges of files on disk
|
|
5
|
+
* (picked or dropped files, and blobs and forms holding them), which a host
|
|
6
|
+
* with `fetchStreams` sends as one stream straight from disk, and an older
|
|
7
|
+
* host is given read into memory. A `Response` reads its body back as
|
|
8
|
+
* text, JSON, bytes or a `Blob`; responses are not streamed.
|
|
7
9
|
*/
|
|
8
|
-
import { encodeMultipart, SimpleBlob, SimpleFormData } from './blob';
|
|
9
|
-
import {
|
|
10
|
+
import { encodeMultipart, partsAreLazy, partsBytes, partSize, SimpleBlob, SimpleFormData } from './blob';
|
|
11
|
+
import { base64Encode, bridgedBytes, utf8Decode, utf8Encode } from './encoding';
|
|
10
12
|
export class SimpleHeaders {
|
|
11
13
|
map = new Map();
|
|
12
14
|
constructor(init) {
|
|
@@ -121,56 +123,57 @@ let randomBytes = (count) => Uint8Array.from({ length: count }, (_, i) => (i * 3
|
|
|
121
123
|
export function setBodyRandomness(random) {
|
|
122
124
|
randomBytes = random;
|
|
123
125
|
}
|
|
124
|
-
/**
|
|
126
|
+
/** The content type a body implies when the caller set none, and its parts. */
|
|
125
127
|
function encodeBody(body) {
|
|
126
128
|
if (body === null || body === undefined)
|
|
127
|
-
return {
|
|
129
|
+
return { parts: null, contentType: null };
|
|
128
130
|
if (typeof body === 'string')
|
|
129
|
-
return { bytes: utf8Encode(body), contentType: 'text/plain;charset=UTF-8' };
|
|
131
|
+
return { parts: [{ bytes: utf8Encode(body) }], contentType: 'text/plain;charset=UTF-8' };
|
|
130
132
|
if (body instanceof SimpleBlob)
|
|
131
|
-
return {
|
|
133
|
+
return { parts: body.parts(), contentType: body.type || null };
|
|
132
134
|
if (body instanceof SimpleFormData)
|
|
133
135
|
return encodeMultipart(body, randomBytes);
|
|
134
136
|
if (body instanceof ArrayBuffer)
|
|
135
|
-
return { bytes: new Uint8Array(body), contentType: null };
|
|
137
|
+
return { parts: [{ bytes: new Uint8Array(body) }], contentType: null };
|
|
136
138
|
if (ArrayBuffer.isView(body))
|
|
137
|
-
return { bytes: new Uint8Array(body.buffer, body.byteOffset, body.byteLength), contentType: null };
|
|
139
|
+
return { parts: [{ bytes: new Uint8Array(body.buffer, body.byteOffset, body.byteLength) }], contentType: null };
|
|
138
140
|
if (typeof body === 'object' && Symbol.iterator in body && typeof body.toString === 'function') {
|
|
139
|
-
return { bytes: utf8Encode(body.toString()), contentType: 'application/x-www-form-urlencoded;charset=UTF-8' };
|
|
141
|
+
return { parts: [{ bytes: utf8Encode(body.toString()) }], contentType: 'application/x-www-form-urlencoded;charset=UTF-8' };
|
|
140
142
|
}
|
|
141
|
-
return { bytes: utf8Encode(String(body)), contentType: 'text/plain;charset=UTF-8' };
|
|
143
|
+
return { parts: [{ bytes: utf8Encode(String(body)) }], contentType: 'text/plain;charset=UTF-8' };
|
|
142
144
|
}
|
|
143
145
|
class Body {
|
|
144
|
-
|
|
146
|
+
/** The body's parts: in memory, or on disk until read. */
|
|
147
|
+
parts;
|
|
145
148
|
bodyUsed = false;
|
|
146
|
-
constructor(
|
|
147
|
-
this.
|
|
149
|
+
constructor(parts) {
|
|
150
|
+
this.parts = parts;
|
|
148
151
|
}
|
|
149
152
|
get body() {
|
|
150
153
|
// No streams; read the body whole with the methods below.
|
|
151
154
|
return null;
|
|
152
155
|
}
|
|
153
|
-
take() {
|
|
156
|
+
async take() {
|
|
154
157
|
if (this.bodyUsed)
|
|
155
158
|
throw new TypeError('body used already');
|
|
156
159
|
this.bodyUsed = true;
|
|
157
|
-
return this.
|
|
160
|
+
return this.parts ? partsBytes(this.parts) : new Uint8Array(0);
|
|
158
161
|
}
|
|
159
162
|
async arrayBuffer() {
|
|
160
|
-
const bytes = this.take();
|
|
163
|
+
const bytes = await this.take();
|
|
161
164
|
return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
162
165
|
}
|
|
163
166
|
async bytesArray() {
|
|
164
167
|
return this.take();
|
|
165
168
|
}
|
|
166
169
|
async text() {
|
|
167
|
-
return utf8Decode(this.take());
|
|
170
|
+
return utf8Decode(await this.take());
|
|
168
171
|
}
|
|
169
172
|
async json() {
|
|
170
|
-
return JSON.parse(utf8Decode(this.take()));
|
|
173
|
+
return JSON.parse(utf8Decode(await this.take()));
|
|
171
174
|
}
|
|
172
175
|
async blob() {
|
|
173
|
-
return new SimpleBlob([this.take()], { type: this.contentType() });
|
|
176
|
+
return new SimpleBlob([await this.take()], { type: this.contentType() });
|
|
174
177
|
}
|
|
175
178
|
/** The body's content type, for `blob()`; a Request or Response reads its headers. */
|
|
176
179
|
contentType() {
|
|
@@ -184,8 +187,8 @@ export class SimpleRequest extends Body {
|
|
|
184
187
|
signal;
|
|
185
188
|
constructor(input, init = {}) {
|
|
186
189
|
const base = input instanceof SimpleRequest ? input : null;
|
|
187
|
-
const {
|
|
188
|
-
super(
|
|
190
|
+
const { parts, contentType } = encodeBody(init.body);
|
|
191
|
+
super(parts ?? base?.rawBody() ?? null);
|
|
189
192
|
this.url = typeof input === 'string' ? input : input instanceof SimpleRequest ? input.url : input.href;
|
|
190
193
|
this.method = (init.method ?? base?.method ?? 'GET').toUpperCase();
|
|
191
194
|
this.headers = new SimpleHeaders(init.headers ?? base?.headers);
|
|
@@ -193,15 +196,19 @@ export class SimpleRequest extends Body {
|
|
|
193
196
|
this.headers.set('content-type', contentType);
|
|
194
197
|
this.signal = init.signal ?? base?.signal ?? new SimpleAbortSignal();
|
|
195
198
|
}
|
|
196
|
-
/** @internal */
|
|
197
|
-
rawBytes() {
|
|
198
|
-
return this.
|
|
199
|
+
/** @internal The body's bytes, read from disk first where they come from there. */
|
|
200
|
+
async rawBytes() {
|
|
201
|
+
return this.parts === null ? null : await partsBytes(this.parts);
|
|
202
|
+
}
|
|
203
|
+
/** @internal The body's parts. */
|
|
204
|
+
rawBody() {
|
|
205
|
+
return this.parts;
|
|
199
206
|
}
|
|
200
207
|
contentType() {
|
|
201
208
|
return this.headers.get('content-type') ?? '';
|
|
202
209
|
}
|
|
203
210
|
clone() {
|
|
204
|
-
return new SimpleRequest(this, {
|
|
211
|
+
return new SimpleRequest(this, {});
|
|
205
212
|
}
|
|
206
213
|
}
|
|
207
214
|
export class SimpleResponse extends Body {
|
|
@@ -212,8 +219,8 @@ export class SimpleResponse extends Body {
|
|
|
212
219
|
type = 'basic';
|
|
213
220
|
redirected = false;
|
|
214
221
|
constructor(body = null, init = {}) {
|
|
215
|
-
const {
|
|
216
|
-
super(
|
|
222
|
+
const { parts, contentType } = encodeBody(body);
|
|
223
|
+
super(parts);
|
|
217
224
|
this.status = init.status ?? 200;
|
|
218
225
|
this.statusText = init.statusText ?? '';
|
|
219
226
|
this.headers = new SimpleHeaders(init.headers);
|
|
@@ -228,7 +235,9 @@ export class SimpleResponse extends Body {
|
|
|
228
235
|
return this.headers.get('content-type') ?? '';
|
|
229
236
|
}
|
|
230
237
|
clone() {
|
|
231
|
-
|
|
238
|
+
const copy = new SimpleResponse(null, { status: this.status, statusText: this.statusText, headers: this.headers, url: this.url });
|
|
239
|
+
copy.parts = this.parts;
|
|
240
|
+
return copy;
|
|
232
241
|
}
|
|
233
242
|
static json(data, init = {}) {
|
|
234
243
|
const response = new SimpleResponse(JSON.stringify(data), init);
|
|
@@ -239,8 +248,30 @@ export class SimpleResponse extends Body {
|
|
|
239
248
|
return new SimpleResponse(null, { status: 0 });
|
|
240
249
|
}
|
|
241
250
|
}
|
|
242
|
-
/**
|
|
243
|
-
|
|
251
|
+
/** In-memory parts as one array (none is on disk); one part is itself. */
|
|
252
|
+
function joinBytes(parts) {
|
|
253
|
+
const [only] = parts;
|
|
254
|
+
if (parts.length === 1 && only && 'bytes' in only)
|
|
255
|
+
return only.bytes;
|
|
256
|
+
const total = parts.reduce((sum, part) => sum + partSize(part), 0);
|
|
257
|
+
const out = new Uint8Array(total);
|
|
258
|
+
let at = 0;
|
|
259
|
+
for (const part of parts) {
|
|
260
|
+
if ('bytes' in part) {
|
|
261
|
+
out.set(part.bytes, at);
|
|
262
|
+
at += part.bytes.byteLength;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return out;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* The fetch globals over the bridge. With `bytes` (a host that carries
|
|
269
|
+
* typed arrays, docs/notes/bytes.md) bodies cross as views beside the JSON
|
|
270
|
+
* both ways; without, as base64. With `streams` (the host `fetchStreams()`,
|
|
271
|
+
* which needs `bytes`) a body holding files on disk goes as parts the host
|
|
272
|
+
* streams from there; without, such a body is read into memory first.
|
|
273
|
+
*/
|
|
274
|
+
export function createFetch(native, options = {}) {
|
|
244
275
|
let nextId = 1;
|
|
245
276
|
const pending = new Map();
|
|
246
277
|
const fetch = (input, init = {}) => {
|
|
@@ -252,20 +283,61 @@ export function createFetch(native) {
|
|
|
252
283
|
}
|
|
253
284
|
const id = nextId++;
|
|
254
285
|
pending.set(id, { resolve, reject });
|
|
286
|
+
let sent = false;
|
|
255
287
|
request.signal.addEventListener('abort', () => {
|
|
256
|
-
if (pending.delete(id))
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
method: request.method,
|
|
263
|
-
headers: request.headers.toObject(),
|
|
264
|
-
body: bytes ? base64Encode(bytes) : null,
|
|
288
|
+
if (!pending.delete(id))
|
|
289
|
+
return;
|
|
290
|
+
// The host stops the task where it can (0.20); an older host finishes it and its answer is ignored.
|
|
291
|
+
if (sent)
|
|
292
|
+
native.fetchCancel?.(id);
|
|
293
|
+
reject(request.signal.reason);
|
|
265
294
|
});
|
|
295
|
+
const head = { url: request.url, method: request.method, headers: request.headers.toObject() };
|
|
296
|
+
const send = (bytes) => {
|
|
297
|
+
if (!pending.has(id))
|
|
298
|
+
return; // aborted while the body was read
|
|
299
|
+
sent = true;
|
|
300
|
+
if (options.bytes) {
|
|
301
|
+
if (bytes)
|
|
302
|
+
native.fetch(id, { ...head, body: { $bytes: 0 }, bytes: true }, bytes);
|
|
303
|
+
else
|
|
304
|
+
native.fetch(id, { ...head, body: null, bytes: true });
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
native.fetch(id, { ...head, body: bytes ? base64Encode(bytes) : null });
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
const parts = request.rawBody();
|
|
311
|
+
if (parts === null || !partsAreLazy(parts)) {
|
|
312
|
+
// Bytes already here go out in this turn (tests and callers see the request at once).
|
|
313
|
+
send(parts === null ? null : joinBytes(parts));
|
|
314
|
+
}
|
|
315
|
+
else if (options.streams && options.bytes) {
|
|
316
|
+
// Files on disk stay there: the host streams the parts in order, their total length known.
|
|
317
|
+
sent = true;
|
|
318
|
+
const views = [];
|
|
319
|
+
const bodyParts = parts.map((part) => {
|
|
320
|
+
if ('bytes' in part) {
|
|
321
|
+
views.push(part.bytes);
|
|
322
|
+
return { $bytes: views.length - 1 };
|
|
323
|
+
}
|
|
324
|
+
return { url: part.file.url, start: part.file.start, end: part.file.end };
|
|
325
|
+
});
|
|
326
|
+
const headers = { ...head.headers };
|
|
327
|
+
if (!('content-length' in headers))
|
|
328
|
+
headers['content-length'] = String(parts.reduce((sum, part) => sum + partSize(part), 0));
|
|
329
|
+
native.fetch(id, { ...head, headers, body: null, bodyParts, bytes: true }, ...views);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
// An older host: the files are read here first.
|
|
333
|
+
partsBytes(parts).then(send, (error) => {
|
|
334
|
+
if (pending.delete(id))
|
|
335
|
+
reject(error instanceof Error ? error : new TypeError(`fetch failed: ${String(error)}`));
|
|
336
|
+
});
|
|
337
|
+
}
|
|
266
338
|
});
|
|
267
339
|
};
|
|
268
|
-
const __sbFetchResult = (id, raw) => {
|
|
340
|
+
const __sbFetchResult = (id, raw, ...buffers) => {
|
|
269
341
|
const waiting = pending.get(id);
|
|
270
342
|
if (!waiting)
|
|
271
343
|
return;
|
|
@@ -276,7 +348,7 @@ export function createFetch(native) {
|
|
|
276
348
|
waiting.reject(error);
|
|
277
349
|
return;
|
|
278
350
|
}
|
|
279
|
-
waiting.resolve(new SimpleResponse(result.body ?
|
|
351
|
+
waiting.resolve(new SimpleResponse(result.body ? bridgedBytes(typeof result.body === 'string' ? result.body : buffers[result.body.$bytes]) : null, {
|
|
280
352
|
status: result.status ?? 200,
|
|
281
353
|
statusText: result.statusText ?? '',
|
|
282
354
|
headers: result.headers ?? {},
|
package/dist/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAiB,MAAM,QAAQ,CAAC;AACxH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIhF,MAAM,OAAO,aAAa;IAChB,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,YAAY,IAAsB;QAChC,IAAI,IAAI,YAAY,aAAa,EAAE,CAAC;YAClC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI;gBAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAY,EAAE,KAAa;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;IAClD,CAAC;IACD,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,GAAG,CAAC,IAAY,EAAE,KAAa;QAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,QAAqE;QAC3E,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG;YAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,IAAI;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IACD,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IACD,qDAAqD;IACrD,QAAQ;QACN,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,iBAAiB;IAC5B,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAY,SAAS,CAAC;IAC5B,OAAO,GAAgD,IAAI,CAAC;IACpD,SAAS,GAAG,IAAI,GAAG,EAAsC,CAAC;IAElE,gBAAgB,CAAC,IAAY,EAAE,QAA4C;QACzE,IAAI,IAAI,KAAK,OAAO;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD,mBAAmB,CAAC,IAAY,EAAE,QAA4C;QAC5E,IAAI,IAAI,KAAK,OAAO;YAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IACD,cAAc;QACZ,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC;IACtC,CAAC;IACD,gBAAgB;IAChB,MAAM,CAAC,MAAe;QACpB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACtB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,MAAgB;QAC3B,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,EAAU;QACvB,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,OAAO,qBAAqB;IACvB,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC1C,KAAK,CAAC,MAAgB;QACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,SAAS,UAAU;IACjB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC;AAQD,+GAA+G;AAC/G,IAAI,WAAW,GAAkC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;AAE9H,MAAM,UAAU,iBAAiB,CAAC,MAAqC;IACrE,WAAW,GAAG,MAAM,CAAC;AACvB,CAAC;AAED,+EAA+E;AAC/E,SAAS,UAAU,CAAC,IAAkB;IACpC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACnF,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC;IACvH,IAAI,IAAI,YAAY,UAAU;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;IAC/F,IAAI,IAAI,YAAY,cAAc;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC9E,IAAI,IAAI,YAAY,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACxG,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC9I,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC/F,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;IAC7H,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC;AACnG,CAAC;AAED,MAAM,IAAI;IACR,0DAA0D;IAChD,KAAK,CAAoB;IACnC,QAAQ,GAAG,KAAK,CAAC;IACjB,YAAY,KAAwB;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IACD,IAAI,IAAI;QACN,0DAA0D;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,CAAC,WAAW;QACf,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAgB,CAAC;IAClG,CAAC;IACD,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,sFAAsF;IAC5E,WAAW;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAUD,MAAM,OAAO,aAAc,SAAQ,IAAI;IAC5B,GAAG,CAAS;IACZ,MAAM,CAAS;IACf,OAAO,CAAgB;IACvB,MAAM,CAAoB;IAEnC,YAAY,KAAgD,EAAE,OAAwB,EAAE;QACtF,MAAM,IAAI,GAAG,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACvG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACpG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;IACvE,CAAC;IACD,mFAAmF;IACnF,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IACD,kCAAkC;IAClC,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACkB,WAAW;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,KAAK;QACH,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AASD,MAAM,OAAO,cAAe,SAAQ,IAAI;IAC7B,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,OAAO,CAAgB;IACvB,GAAG,CAAS;IACZ,IAAI,GAAG,OAAO,CAAC;IACf,UAAU,GAAG,KAAK,CAAC;IAE5B,YAAY,OAAqB,IAAI,EAAE,OAAyB,EAAE;QAChE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACpG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACjD,CAAC;IACkB,WAAW;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,KAAK;QACH,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAClI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,IAAa,EAAE,OAAyB,EAAE;QACpD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAChE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACzD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,CAAC,KAAK;QACV,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;CACF;AAED,0EAA0E;AAC1E,SAAS,SAAS,CAAC,KAA0B;IAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACrB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAaD;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,MAAmD,EAAE,UAAkD,EAAE;IACnI,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6F,CAAC;IAErH,MAAM,KAAK,GAA0B,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrD,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACrC,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC5C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAAE,OAAO;gBAChC,oGAAoG;gBACpG,IAAI,IAAI;oBAAE,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC/F,MAAM,IAAI,GAAG,CAAC,KAAwB,EAAQ,EAAE;gBAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,OAAO,CAAC,kCAAkC;gBAChE,IAAI,GAAG,IAAI,CAAC;gBACZ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,IAAI,KAAK;wBAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;;wBAC7E,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC,CAAC;YACF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,sFAAsF;gBACtF,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC5C,2FAA2F;gBAC3F,IAAI,GAAG,IAAI,CAAC;gBACZ,MAAM,KAAK,GAAiB,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAiD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACjF,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;wBACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACvB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,CAAC;oBACD,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5E,CAAC,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,CAAC,CAAC,gBAAgB,IAAI,OAAO,CAAC;oBAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7H,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACN,gDAAgD;gBAChD,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAc,EAAE,EAAE;oBAC9C,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBAAE,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,iBAAiB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,eAAe,GAAoC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE;QAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,MAAM,GAAsB,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC,CAAC,CAAC,GAAG,CAAC;QACzG,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,iBAAiB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,OAAO,CACb,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACjI,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,GAAG;YAC5B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;YACnC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE;SACtB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,KAAK;QACL,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,cAAc;QACxB,eAAe,EAAE,qBAAqB;QACtC,WAAW,EAAE,iBAAiB;QAC9B,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
package/dist/hostRequests.d.ts
CHANGED
|
@@ -14,17 +14,25 @@
|
|
|
14
14
|
* `webAuthenticate` is the sign-in window apps open for OAuth: the system's
|
|
15
15
|
* sheet, resolving with the callback URL.
|
|
16
16
|
*
|
|
17
|
+
* `audioEngine` is `AVAudioEngine` (@swiftbrowser/react): each command an
|
|
18
|
+
* `audioEngine` request, which Host/AudioEngineBridge.swift performs as it
|
|
19
|
+
* arrives, in order. `languageModel` is Foundation Models' on-device model
|
|
20
|
+
* (`LanguageModelSession`): `languageModel` requests, which
|
|
21
|
+
* Host/LanguageModelBridge.swift answers.
|
|
22
|
+
*
|
|
17
23
|
* `files` is the app's sandbox for `fileManager` (@swiftbrowser/react): the
|
|
18
|
-
* `files` requests of Host/FilesBridge.swift, bytes crossing as base64, with
|
|
24
|
+
* `files` requests of Host/FilesBridge.swift, bytes crossing as views beside the JSON (base64 to an older host), with
|
|
19
25
|
* the standard directories from the bridge's `appDirectories()`.
|
|
20
26
|
*/
|
|
21
27
|
import type { NativeBridge } from './bridge';
|
|
22
|
-
export type HostRequestBridge = Required<Pick<NativeBridge, 'hostRequest'>> & Pick<NativeBridge, 'appDirectories'>;
|
|
23
|
-
/** A file as it crosses the bridge: its name, MIME type and bytes (base64). */
|
|
28
|
+
export type HostRequestBridge = Required<Pick<NativeBridge, 'hostRequest'>> & Pick<NativeBridge, 'appDirectories' | 'hostRequestBytes'>;
|
|
29
|
+
/** A file as it crosses the bridge: its name, MIME type and bytes (a view beside the JSON, or base64 to a host without them). */
|
|
24
30
|
export interface BridgedFile {
|
|
25
31
|
name: string;
|
|
26
32
|
type: string;
|
|
27
|
-
|
|
33
|
+
/** The bytes; absent when the file is still on disk, named by `url`. */
|
|
34
|
+
data?: string | Uint8Array;
|
|
35
|
+
url?: string;
|
|
28
36
|
}
|
|
29
37
|
export interface WebAuthenticateOptions {
|
|
30
38
|
/** The scheme of the callback URL the sign-in ends with (`myapp` for `myapp://auth`); universal links need none. */
|
|
@@ -34,13 +42,23 @@ export interface WebAuthenticateOptions {
|
|
|
34
42
|
}
|
|
35
43
|
/** Points the requests at the bridge (the runtime, once per install). */
|
|
36
44
|
export declare function installHostRequests(native: HostRequestBridge): void;
|
|
37
|
-
/** The bridge's `__sbHostResponse(id, result)`. */
|
|
45
|
+
/** The bridge's `__sbHostResponse(id, result, ...buffers)`: the buffers go where the JSON says `{ "$bytes": n }`. */
|
|
38
46
|
export declare function receiveHostResponse(id: number, result: string | {
|
|
39
47
|
value?: unknown;
|
|
40
48
|
error?: string;
|
|
41
|
-
}): void;
|
|
49
|
+
}, ...buffers: ArrayBufferView[]): void;
|
|
42
50
|
/** Performs one request of `kind` with `params`; resolves with the host's value. */
|
|
43
51
|
export declare function hostRequest<T = unknown>(kind: string, params: Record<string, unknown>): Promise<T>;
|
|
52
|
+
/**
|
|
53
|
+
* The params as JSON with their bytes lifted out: each typed array or
|
|
54
|
+
* `ArrayBuffer` becomes `{ "$bytes": n }` and the nth of `views`, for a host
|
|
55
|
+
* with `hostRequestBytes`; without one, base64 of its bytes in place, the
|
|
56
|
+
* form every host reads (docs/notes/bytes.md).
|
|
57
|
+
*/
|
|
58
|
+
export declare function liftBytes(params: unknown, lift: boolean): {
|
|
59
|
+
json: string;
|
|
60
|
+
views: ArrayBufferView[];
|
|
61
|
+
};
|
|
44
62
|
/** Forgets the bridge and the waiting requests, for tests. */
|
|
45
63
|
export declare function resetHostRequests(): void;
|
|
46
64
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hostRequests.d.ts","sourceRoot":"","sources":["../src/hostRequests.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hostRequests.d.ts","sourceRoot":"","sources":["../src/hostRequests.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAI7C,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;AAExI,iIAAiI;AACjI,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,oHAAoH;IACpH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAMD,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAGnE;AAED,qHAAqH;AACrH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAmBzI;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAclG;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,EAAE,CAAA;CAAE,CAUpG;AAYD,8DAA8D;AAC9D,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAgCD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxG;AA4BD,mHAAmH;AACnH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAUjE;AAuDD,sGAAsG;AACtG,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkF/D;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAOjF"}
|
package/dist/hostRequests.js
CHANGED
|
@@ -14,12 +14,18 @@
|
|
|
14
14
|
* `webAuthenticate` is the sign-in window apps open for OAuth: the system's
|
|
15
15
|
* sheet, resolving with the callback URL.
|
|
16
16
|
*
|
|
17
|
+
* `audioEngine` is `AVAudioEngine` (@swiftbrowser/react): each command an
|
|
18
|
+
* `audioEngine` request, which Host/AudioEngineBridge.swift performs as it
|
|
19
|
+
* arrives, in order. `languageModel` is Foundation Models' on-device model
|
|
20
|
+
* (`LanguageModelSession`): `languageModel` requests, which
|
|
21
|
+
* Host/LanguageModelBridge.swift answers.
|
|
22
|
+
*
|
|
17
23
|
* `files` is the app's sandbox for `fileManager` (@swiftbrowser/react): the
|
|
18
|
-
* `files` requests of Host/FilesBridge.swift, bytes crossing as base64, with
|
|
24
|
+
* `files` requests of Host/FilesBridge.swift, bytes crossing as views beside the JSON (base64 to an older host), with
|
|
19
25
|
* the standard directories from the bridge's `appDirectories()`.
|
|
20
26
|
*/
|
|
21
|
-
import { objectURL, SimpleBlob, SimpleFile } from './blob';
|
|
22
|
-
import {
|
|
27
|
+
import { blobBytes, LazyFile, objectURL, SimpleBlob, SimpleFile } from './blob';
|
|
28
|
+
import { base64Encode, bridgedBytes } from './encoding';
|
|
23
29
|
import { nativeUndoHost } from './undo';
|
|
24
30
|
let bridge = null;
|
|
25
31
|
let nextId = 1;
|
|
@@ -29,15 +35,16 @@ export function installHostRequests(native) {
|
|
|
29
35
|
bridge = native;
|
|
30
36
|
fileWatchers.clear();
|
|
31
37
|
}
|
|
32
|
-
/** The bridge's `__sbHostResponse(id, result)`. */
|
|
33
|
-
export function receiveHostResponse(id, result) {
|
|
38
|
+
/** The bridge's `__sbHostResponse(id, result, ...buffers)`: the buffers go where the JSON says `{ "$bytes": n }`. */
|
|
39
|
+
export function receiveHostResponse(id, result, ...buffers) {
|
|
34
40
|
const waiting = pending.get(id);
|
|
35
41
|
if (!waiting)
|
|
36
42
|
return;
|
|
37
43
|
pending.delete(id);
|
|
38
44
|
let parsed;
|
|
39
45
|
try {
|
|
40
|
-
parsed =
|
|
46
|
+
parsed =
|
|
47
|
+
typeof result === 'string' ? JSON.parse(result, buffers.length ? placeBytes(buffers) : undefined) : result;
|
|
41
48
|
}
|
|
42
49
|
catch {
|
|
43
50
|
waiting.reject(new Error('host: malformed response'));
|
|
@@ -62,8 +69,42 @@ export function hostRequest(kind, params) {
|
|
|
62
69
|
}
|
|
63
70
|
const id = nextId++;
|
|
64
71
|
pending.set(id, { resolve: resolve, reject });
|
|
65
|
-
|
|
72
|
+
// Through `hostRequestBytes` whenever the host has it, views or not: the
|
|
73
|
+
// host then answers with bytes beside the JSON too.
|
|
74
|
+
const { json, views } = liftBytes(params, bridge.hostRequestBytes !== undefined);
|
|
75
|
+
if (bridge.hostRequestBytes)
|
|
76
|
+
bridge.hostRequestBytes(id, kind, json, ...views);
|
|
77
|
+
else
|
|
78
|
+
bridge.hostRequest(id, kind, json);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The params as JSON with their bytes lifted out: each typed array or
|
|
83
|
+
* `ArrayBuffer` becomes `{ "$bytes": n }` and the nth of `views`, for a host
|
|
84
|
+
* with `hostRequestBytes`; without one, base64 of its bytes in place, the
|
|
85
|
+
* form every host reads (docs/notes/bytes.md).
|
|
86
|
+
*/
|
|
87
|
+
export function liftBytes(params, lift) {
|
|
88
|
+
const views = [];
|
|
89
|
+
const json = JSON.stringify(params, (_key, value) => {
|
|
90
|
+
const view = value instanceof ArrayBuffer ? new Uint8Array(value) : ArrayBuffer.isView(value) ? value : null;
|
|
91
|
+
if (!view)
|
|
92
|
+
return value;
|
|
93
|
+
if (!lift)
|
|
94
|
+
return base64Encode(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));
|
|
95
|
+
views.push(view);
|
|
96
|
+
return { $bytes: views.length - 1 };
|
|
66
97
|
});
|
|
98
|
+
return { json, views };
|
|
99
|
+
}
|
|
100
|
+
/** A JSON reviver putting `buffers` where the text says `{ "$bytes": n }`. */
|
|
101
|
+
function placeBytes(buffers) {
|
|
102
|
+
return (_key, value) => {
|
|
103
|
+
if (value && typeof value === 'object' && typeof value.$bytes === 'number') {
|
|
104
|
+
return buffers[value.$bytes] ?? value;
|
|
105
|
+
}
|
|
106
|
+
return value;
|
|
107
|
+
};
|
|
67
108
|
}
|
|
68
109
|
/** Forgets the bridge and the waiting requests, for tests. */
|
|
69
110
|
export function resetHostRequests() {
|
|
@@ -72,11 +113,23 @@ export function resetHostRequests() {
|
|
|
72
113
|
nextId = 1;
|
|
73
114
|
}
|
|
74
115
|
async function bridgedFile(file) {
|
|
75
|
-
|
|
116
|
+
// A picked file still on disk goes as its URL: the host reads it itself.
|
|
117
|
+
if (file instanceof LazyFile && file.isWhole)
|
|
118
|
+
return { name: file.name ?? 'file', type: file.type, url: file.url };
|
|
119
|
+
return { name: file.name ?? 'file', type: file.type, data: await blobBytes(file) };
|
|
120
|
+
}
|
|
121
|
+
/** Reads a range of a file on disk through the files bridge (FilesBridge.swift `readRange`). */
|
|
122
|
+
async function readFileRange(url, start, end) {
|
|
123
|
+
return bridgedBytes((await hostRequest('files', { action: 'readRange', url, start, end }))?.data ?? '');
|
|
76
124
|
}
|
|
77
125
|
function filesOf(value) {
|
|
78
126
|
const files = value?.files ?? [];
|
|
79
|
-
return files.map((file) =>
|
|
127
|
+
return files.map((file) => {
|
|
128
|
+
const options = { type: file.type, ...(typeof file.lastModified === 'number' ? { lastModified: file.lastModified } : {}) };
|
|
129
|
+
if (file.data === undefined && typeof file.url === 'string')
|
|
130
|
+
return LazyFile.make(file.url, file.name, file.size ?? 0, readFileRange, options);
|
|
131
|
+
return new SimpleFile([bridgedBytes(file.data ?? '')], file.name, options);
|
|
132
|
+
});
|
|
80
133
|
}
|
|
81
134
|
/**
|
|
82
135
|
* Opens the system's sign-in sheet at `url` and resolves with the callback
|
|
@@ -139,13 +192,29 @@ function nativeFiles(directories) {
|
|
|
139
192
|
fileWatchers.add(listener);
|
|
140
193
|
return () => void fileWatchers.delete(listener);
|
|
141
194
|
},
|
|
142
|
-
read: async (url) =>
|
|
143
|
-
|
|
195
|
+
read: async (url) => bridgedBytes((await files({ action: 'read', url }))?.data ?? ''),
|
|
196
|
+
// A range read through `FileHandle`, so a large file is read a piece at a time (FilesBridge.swift `readRange`).
|
|
197
|
+
readRange: async (url, start, end) => bridgedBytes((await files({ action: 'readRange', url, start, end }))?.data ?? ''),
|
|
198
|
+
// A file the viewer picked or dropped (a `LazyFile`, still on disk) is copied there by the host (`importItem`); other bytes cross the bridge.
|
|
199
|
+
write: async (url, data) => {
|
|
200
|
+
if (data instanceof LazyFile) {
|
|
201
|
+
if (data.isWhole) {
|
|
202
|
+
await files({ action: 'importItem', from: data.url, to: url });
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
await files({ action: 'write', url, data: await data.bytesAsync() });
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
await files({ action: 'write', url, data: data instanceof SimpleBlob ? data.bytes() : data });
|
|
209
|
+
},
|
|
144
210
|
remove: (url) => files({ action: 'remove', url }).then(() => undefined),
|
|
145
211
|
createDirectory: (url) => files({ action: 'createDirectory', url }).then(() => undefined),
|
|
146
212
|
list: async (url) => (await files({ action: 'list', url }))?.urls ?? [],
|
|
147
213
|
attributes: async (url) => {
|
|
148
|
-
const found = await files({
|
|
214
|
+
const found = await files({
|
|
215
|
+
action: 'attributes',
|
|
216
|
+
url,
|
|
217
|
+
});
|
|
149
218
|
if (!found || typeof found.size !== 'number')
|
|
150
219
|
return null;
|
|
151
220
|
return {
|
|
@@ -167,6 +236,8 @@ export function nativeHostEnvironment() {
|
|
|
167
236
|
const directories = appDirectories();
|
|
168
237
|
return {
|
|
169
238
|
...(directories ? { files: nativeFiles(directories) } : {}),
|
|
239
|
+
// A file dropped on the app, left on disk by the host (Drawing.swift's drop destination): a `LazyFile` read by range.
|
|
240
|
+
fileFromReference: (item) => LazyFile.make(item.url, item.path ?? item.name ?? 'file', item.size ?? 0, readFileRange, { type: item.type }),
|
|
170
241
|
share: async (data) => {
|
|
171
242
|
const params = {};
|
|
172
243
|
if (data.title)
|
|
@@ -186,7 +257,20 @@ export function nativeHostEnvironment() {
|
|
|
186
257
|
},
|
|
187
258
|
canShare: () => true,
|
|
188
259
|
download: (blob, filename) => {
|
|
189
|
-
|
|
260
|
+
// A picked file still on disk goes by URL (the host copies it); bytes go in the same turn.
|
|
261
|
+
const file = blob instanceof LazyFile && blob.isWhole ? { name: filename, type: blob.type, url: blob.url } : null;
|
|
262
|
+
if (file) {
|
|
263
|
+
void hostRequest('share', { files: [file] }).catch(() => undefined);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
if (blob instanceof LazyFile) {
|
|
267
|
+
void blob
|
|
268
|
+
.bytesAsync()
|
|
269
|
+
.then((data) => hostRequest('share', { files: [{ name: filename, type: blob.type, data }] }))
|
|
270
|
+
.catch(() => undefined);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
void hostRequest('share', { files: [{ name: filename, type: blob.type, data: blob.bytes() }] }).catch(() => undefined);
|
|
190
274
|
},
|
|
191
275
|
pickFiles: async (options) => filesOf(await hostRequest('pickFiles', { accept: options.accept, multiple: options.multiple })),
|
|
192
276
|
// `fileExporter`: the document picker, saving the files where the viewer chooses.
|
|
@@ -194,12 +278,13 @@ export function nativeHostEnvironment() {
|
|
|
194
278
|
const result = await hostRequest('exportFiles', { files: await Promise.all(files.map(bridgedFile)) });
|
|
195
279
|
return { outcome: result?.outcome ?? 'cancelled', ...(result?.urls ? { urls: result.urls } : {}) };
|
|
196
280
|
},
|
|
197
|
-
|
|
281
|
+
// A picked file still on disk is its own URL (the image loader and AVPlayer read files); bytes become a `data:` URL.
|
|
282
|
+
objectURL: (file) => (file instanceof LazyFile && file.isWhole ? file.url : objectURL(file)),
|
|
198
283
|
clipboard: {
|
|
199
284
|
writeText: (text) => hostRequest('clipboard', { action: 'write', text }).then(() => undefined),
|
|
200
285
|
writeImage: async (png) => {
|
|
201
286
|
const file = await png;
|
|
202
|
-
await hostRequest('clipboard', { action: 'write', files: [{ name: 'image.png', type: file.type || 'image/png', data:
|
|
287
|
+
await hostRequest('clipboard', { action: 'write', files: [{ name: 'image.png', type: file.type || 'image/png', data: await blobBytes(file) }] });
|
|
203
288
|
},
|
|
204
289
|
readText: async () => (await hostRequest('clipboard', { action: 'readText' }))?.text ?? '',
|
|
205
290
|
},
|
|
@@ -209,6 +294,14 @@ export function nativeHostEnvironment() {
|
|
|
209
294
|
signIn: (options) => hostRequest('appleSignIn', { action: 'signIn', ...options }),
|
|
210
295
|
credentialState: async (user) => (await hostRequest('appleSignIn', { action: 'credentialState', user }))?.state ?? 'unknown',
|
|
211
296
|
},
|
|
297
|
+
// `AVAudioEngine` (AudioEngineBridge.swift): the app's engine commands, answered in the order sent.
|
|
298
|
+
audioEngine: {
|
|
299
|
+
perform: (command) => hostRequest('audioEngine', command),
|
|
300
|
+
},
|
|
301
|
+
// Foundation Models (LanguageModelBridge.swift): the app's sessions and streams, a `next` answered as a stream grows.
|
|
302
|
+
languageModel: {
|
|
303
|
+
perform: (command) => hostRequest('languageModel', command),
|
|
304
|
+
},
|
|
212
305
|
// `AVAudioRecorder` (AudioRecorderBridge.swift): a recording ends as a file URL in Documents; `trim` writes another.
|
|
213
306
|
audioRecorder: {
|
|
214
307
|
start: () => hostRequest('audioRecord', { action: 'start' }).then(() => undefined),
|