@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.
Files changed (102) hide show
  1. package/README.md +53 -11
  2. package/bin/swiftbrowser-native.mjs +47 -0
  3. package/dist/blob.d.ts +85 -11
  4. package/dist/blob.d.ts.map +1 -1
  5. package/dist/blob.js +184 -34
  6. package/dist/blob.js.map +1 -1
  7. package/dist/bridge.d.ts +66 -8
  8. package/dist/bridge.d.ts.map +1 -1
  9. package/dist/bridge.js.map +1 -1
  10. package/dist/encoding.d.ts +13 -0
  11. package/dist/encoding.d.ts.map +1 -1
  12. package/dist/encoding.js +24 -0
  13. package/dist/encoding.js.map +1 -1
  14. package/dist/fetch.d.ts +27 -13
  15. package/dist/fetch.d.ts.map +1 -1
  16. package/dist/fetch.js +117 -45
  17. package/dist/fetch.js.map +1 -1
  18. package/dist/hostRequests.d.ts +24 -6
  19. package/dist/hostRequests.d.ts.map +1 -1
  20. package/dist/hostRequests.js +108 -15
  21. package/dist/hostRequests.js.map +1 -1
  22. package/dist/index.d.ts +1 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/ios.d.ts +79 -0
  27. package/dist/ios.d.ts.map +1 -0
  28. package/dist/ios.js +181 -0
  29. package/dist/ios.js.map +1 -0
  30. package/dist/runtime.d.ts.map +1 -1
  31. package/dist/runtime.js +16 -7
  32. package/dist/runtime.js.map +1 -1
  33. package/dist/subtle.d.ts +1 -1
  34. package/dist/subtle.d.ts.map +1 -1
  35. package/dist/subtle.js +9 -5
  36. package/dist/subtle.js.map +1 -1
  37. package/dist/webSocket.d.ts +12 -5
  38. package/dist/webSocket.d.ts.map +1 -1
  39. package/dist/webSocket.js +37 -11
  40. package/dist/webSocket.js.map +1 -1
  41. package/package.json +7 -3
  42. package/src/blob.ts +215 -34
  43. package/src/bridge.ts +56 -8
  44. package/src/encoding.ts +22 -0
  45. package/src/fetch.ts +111 -48
  46. package/src/hostRequests.ts +129 -22
  47. package/src/index.ts +1 -2
  48. package/src/ios.ts +253 -0
  49. package/src/runtime.ts +23 -8
  50. package/src/subtle.ts +10 -6
  51. package/src/webSocket.ts +37 -13
  52. package/swift/Packages/SwiftBrowserDSP/Package.swift +31 -0
  53. package/swift/Packages/SwiftBrowserDSP/README.md +42 -0
  54. package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSP/ProgramNode.swift +306 -0
  55. package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSP/ScopeView.swift +79 -0
  56. package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSPCore/Machine.swift +1561 -0
  57. package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSPCore/Program.swift +483 -0
  58. package/swift/Packages/SwiftBrowserLocalModel/Package.swift +35 -0
  59. package/swift/Packages/SwiftBrowserLocalModel/README.md +66 -0
  60. package/swift/Packages/SwiftBrowserLocalModel/Sources/SwiftBrowserLocalModel/LlamaEngine.swift +223 -0
  61. package/swift/Packages/SwiftBrowserLocalModel/Sources/SwiftBrowserLocalModel/LocalLanguageModel.swift +409 -0
  62. package/swift/Packages/SwiftBrowserShader/Package.swift +31 -0
  63. package/swift/Packages/SwiftBrowserShader/README.md +45 -0
  64. package/swift/Packages/SwiftBrowserShader/Sources/SwiftBrowserShader/ShaderRenderer.swift +103 -0
  65. package/swift/Packages/SwiftBrowserShader/Sources/SwiftBrowserShader/ShaderView.swift +168 -0
  66. package/swift/Packages/SwiftBrowserShader/Sources/SwiftBrowserShaderCore/ShaderProps.swift +120 -0
  67. package/swift/Sources/SwiftBrowserNative/Host/AudioEngineBridge.swift +921 -0
  68. package/swift/Sources/SwiftBrowserNative/Host/AudioEngineNodes.swift +70 -0
  69. package/swift/Sources/SwiftBrowserNative/Host/BodyStream.swift +166 -0
  70. package/swift/Sources/SwiftBrowserNative/Host/FilesBridge.swift +144 -10
  71. package/swift/Sources/SwiftBrowserNative/Host/HostBridge.swift +151 -27
  72. package/swift/Sources/SwiftBrowserNative/Host/HostRequestBridge.swift +139 -40
  73. package/swift/Sources/SwiftBrowserNative/Host/JSHost.swift +116 -0
  74. package/swift/Sources/SwiftBrowserNative/Host/JavaScriptCoreHost.swift +141 -2
  75. package/swift/Sources/SwiftBrowserNative/Host/LanguageModelBridge.swift +511 -0
  76. package/swift/Sources/SwiftBrowserNative/Host/LanguageModelProvider.swift +195 -0
  77. package/swift/Sources/SwiftBrowserNative/Host/WebSocketBridge.swift +24 -11
  78. package/swift/Sources/SwiftBrowserNative/Host/WorkerHost.swift +3 -2
  79. package/swift/Sources/SwiftBrowserNative/Runtime/NativeFunctions.swift +1 -1
  80. package/swift/Sources/SwiftBrowserNative/Runtime/ViewRegistry.swift +57 -0
  81. package/swift/Sources/SwiftBrowserNative/Views/ElementView.swift +12 -7
  82. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Controls.swift +18 -1
  83. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Drawing.swift +378 -0
  84. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Lists.swift +41 -1
  85. package/swift/Sources/SwiftBrowserNative/Views/Kinds/More.swift +88 -17
  86. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Navigation.swift +87 -21
  87. package/swift/Sources/SwiftBrowserNative/Views/Kinds/PinchTracker.swift +200 -0
  88. package/swift/Sources/SwiftBrowserNative/Views/Kinds/PopTap.swift +103 -0
  89. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Stacks.swift +3 -2
  90. package/swift/Sources/SwiftBrowserNative/Views/StyleModifier.swift +146 -0
  91. package/swift/Sources/SwiftBrowserProtocol/Drawing.swift +306 -0
  92. package/swift/Sources/SwiftBrowserProtocol/Props.swift +31 -2
  93. package/swift/Sources/SwiftBrowserProtocol/RendererEvent.swift +24 -3
  94. package/swift/Sources/SwiftBrowserProtocol/Style.swift +87 -0
  95. package/swift/Sources/SwiftBrowserTree/OpTree.swift +25 -0
  96. package/wasm/SwiftBrowserNative.wasm +2 -2
  97. package/dist/native.d.ts +0 -19
  98. package/dist/native.d.ts.map +0 -1
  99. package/dist/native.js +0 -17
  100. package/dist/native.js.map +0 -1
  101. package/src/native.ts +0 -35
  102. 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). Bodies cross
4
- * as base64; a `Response` reads them back as text, JSON, bytes or a `Blob`.
5
- * A `Blob` or `FormData` body (blob.ts) is sent whole, the form as
6
- * multipart; there are no streams.
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 { base64Decode, base64Encode, utf8Decode, utf8Encode } from './encoding';
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
- /** Bytes of a body, and the content type it implies when the caller set none. */
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 { bytes: null, contentType: null };
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 { bytes: body.bytes(), contentType: body.type || null };
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
- bytes;
146
+ /** The body's parts: in memory, or on disk until read. */
147
+ parts;
145
148
  bodyUsed = false;
146
- constructor(bytes) {
147
- this.bytes = bytes;
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.bytes ?? new Uint8Array(0);
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 { bytes, contentType } = encodeBody(init.body);
188
- super(bytes ?? base?.rawBytes() ?? null);
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.bytes;
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, { body: this.bytes });
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 { bytes, contentType } = encodeBody(body);
216
- super(bytes);
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
- return new SimpleResponse(this.bytes, { status: this.status, statusText: this.statusText, headers: this.headers, url: this.url });
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
- /** The fetch globals over the bridge. */
243
- export function createFetch(native) {
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
- reject(request.signal.reason);
258
- });
259
- const bytes = request.rawBytes();
260
- native.fetch(id, {
261
- url: request.url,
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 ? base64Decode(result.body) : null, {
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":"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"}
@@ -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
- data: string;
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;;;;;;;;;;;;;;;;;;;GAmBG;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,CAAC,CAAC;AAEnH,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,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,mDAAmD;AACnD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkB1G;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,CAUlG;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAWD;;;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;AAqCD,sGAAsG;AACtG,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuD/D;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAOjF"}
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"}
@@ -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 { base64Decode, base64Encode } from './encoding';
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 = typeof result === 'string' ? JSON.parse(result) : result;
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
- bridge.hostRequest(id, kind, JSON.stringify(params));
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
- return { name: file.name ?? 'file', type: file.type, data: base64Encode(file.bytes()) };
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) => new SimpleFile([base64Decode(file.data)], file.name, { type: file.type }));
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) => base64Decode((await files({ action: 'read', url }))?.data ?? ''),
143
- write: (url, data) => files({ action: 'write', url, data: base64Encode(data) }).then(() => undefined),
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({ action: 'attributes', url });
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
- void hostRequest('share', { files: [{ name: filename, type: blob.type, data: base64Encode(blob.bytes()) }] }).catch(() => undefined);
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
- objectURL: (file) => objectURL(file),
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: base64Encode(file.bytes()) }] });
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),