@swiftbrowser/native 0.18.2 → 0.19.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 (73) hide show
  1. package/README.md +19 -0
  2. package/bin/swiftbrowser-native.mjs +47 -0
  3. package/dist/bridge.d.ts +34 -7
  4. package/dist/bridge.d.ts.map +1 -1
  5. package/dist/bridge.js.map +1 -1
  6. package/dist/encoding.d.ts +13 -0
  7. package/dist/encoding.d.ts.map +1 -1
  8. package/dist/encoding.js +24 -0
  9. package/dist/encoding.js.map +1 -1
  10. package/dist/fetch.d.ts +10 -4
  11. package/dist/fetch.d.ts.map +1 -1
  12. package/dist/fetch.js +19 -11
  13. package/dist/fetch.js.map +1 -1
  14. package/dist/hostRequests.d.ts +22 -6
  15. package/dist/hostRequests.d.ts.map +1 -1
  16. package/dist/hostRequests.js +65 -13
  17. package/dist/hostRequests.js.map +1 -1
  18. package/dist/ios.d.ts +79 -0
  19. package/dist/ios.d.ts.map +1 -0
  20. package/dist/ios.js +181 -0
  21. package/dist/ios.js.map +1 -0
  22. package/dist/runtime.d.ts.map +1 -1
  23. package/dist/runtime.js +16 -7
  24. package/dist/runtime.js.map +1 -1
  25. package/dist/subtle.d.ts +1 -1
  26. package/dist/subtle.d.ts.map +1 -1
  27. package/dist/subtle.js +9 -5
  28. package/dist/subtle.js.map +1 -1
  29. package/dist/webSocket.d.ts +12 -5
  30. package/dist/webSocket.d.ts.map +1 -1
  31. package/dist/webSocket.js +24 -10
  32. package/dist/webSocket.js.map +1 -1
  33. package/package.json +7 -3
  34. package/src/bridge.ts +30 -7
  35. package/src/encoding.ts +22 -0
  36. package/src/fetch.ts +18 -13
  37. package/src/hostRequests.ts +72 -19
  38. package/src/ios.ts +253 -0
  39. package/src/runtime.ts +23 -8
  40. package/src/subtle.ts +10 -6
  41. package/src/webSocket.ts +27 -12
  42. package/swift/Packages/SwiftBrowserDSP/Package.swift +31 -0
  43. package/swift/Packages/SwiftBrowserDSP/README.md +42 -0
  44. package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSP/ProgramNode.swift +203 -0
  45. package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSPCore/Machine.swift +523 -0
  46. package/swift/Packages/SwiftBrowserDSP/Sources/SwiftBrowserDSPCore/Program.swift +188 -0
  47. package/swift/Packages/SwiftBrowserLocalModel/Package.swift +35 -0
  48. package/swift/Packages/SwiftBrowserLocalModel/README.md +66 -0
  49. package/swift/Packages/SwiftBrowserLocalModel/Sources/SwiftBrowserLocalModel/LlamaEngine.swift +223 -0
  50. package/swift/Packages/SwiftBrowserLocalModel/Sources/SwiftBrowserLocalModel/LocalLanguageModel.swift +409 -0
  51. package/swift/Sources/SwiftBrowserNative/Host/AudioEngineBridge.swift +921 -0
  52. package/swift/Sources/SwiftBrowserNative/Host/AudioEngineNodes.swift +70 -0
  53. package/swift/Sources/SwiftBrowserNative/Host/FilesBridge.swift +3 -3
  54. package/swift/Sources/SwiftBrowserNative/Host/HostBridge.swift +106 -28
  55. package/swift/Sources/SwiftBrowserNative/Host/HostRequestBridge.swift +43 -13
  56. package/swift/Sources/SwiftBrowserNative/Host/JSHost.swift +116 -0
  57. package/swift/Sources/SwiftBrowserNative/Host/JavaScriptCoreHost.swift +141 -2
  58. package/swift/Sources/SwiftBrowserNative/Host/LanguageModelBridge.swift +511 -0
  59. package/swift/Sources/SwiftBrowserNative/Host/LanguageModelProvider.swift +195 -0
  60. package/swift/Sources/SwiftBrowserNative/Host/WebSocketBridge.swift +24 -11
  61. package/swift/Sources/SwiftBrowserNative/Host/WorkerHost.swift +3 -2
  62. package/swift/Sources/SwiftBrowserNative/Views/ElementView.swift +1 -0
  63. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Controls.swift +18 -1
  64. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Lists.swift +41 -1
  65. package/swift/Sources/SwiftBrowserNative/Views/Kinds/More.swift +88 -17
  66. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Navigation.swift +81 -20
  67. package/swift/Sources/SwiftBrowserNative/Views/Kinds/PinchTracker.swift +200 -0
  68. package/swift/Sources/SwiftBrowserNative/Views/Kinds/PopTap.swift +100 -0
  69. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Stacks.swift +3 -2
  70. package/swift/Sources/SwiftBrowserNative/Views/StyleModifier.swift +4 -0
  71. package/swift/Sources/SwiftBrowserProtocol/Props.swift +26 -0
  72. package/swift/Sources/SwiftBrowserTree/OpTree.swift +25 -0
  73. package/wasm/SwiftBrowserNative.wasm +2 -2
@@ -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
27
  import { objectURL, SimpleBlob, SimpleFile } from './blob';
22
- import { base64Decode, base64Encode } from './encoding';
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,11 @@ 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
+ return { name: file.name ?? 'file', type: file.type, data: file.bytes() };
76
117
  }
77
118
  function filesOf(value) {
78
119
  const files = value?.files ?? [];
79
- return files.map((file) => new SimpleFile([base64Decode(file.data)], file.name, { type: file.type }));
120
+ return files.map((file) => new SimpleFile([bridgedBytes(file.data)], file.name, { type: file.type }));
80
121
  }
81
122
  /**
82
123
  * Opens the system's sign-in sheet at `url` and resolves with the callback
@@ -139,13 +180,16 @@ function nativeFiles(directories) {
139
180
  fileWatchers.add(listener);
140
181
  return () => void fileWatchers.delete(listener);
141
182
  },
142
- read: async (url) => base64Decode((await files({ action: 'read', url }))?.data ?? ''),
143
- write: (url, data) => files({ action: 'write', url, data: base64Encode(data) }).then(() => undefined),
183
+ read: async (url) => bridgedBytes((await files({ action: 'read', url }))?.data ?? ''),
184
+ write: (url, data) => files({ action: 'write', url, data }).then(() => undefined),
144
185
  remove: (url) => files({ action: 'remove', url }).then(() => undefined),
145
186
  createDirectory: (url) => files({ action: 'createDirectory', url }).then(() => undefined),
146
187
  list: async (url) => (await files({ action: 'list', url }))?.urls ?? [],
147
188
  attributes: async (url) => {
148
- const found = await files({ action: 'attributes', url });
189
+ const found = await files({
190
+ action: 'attributes',
191
+ url,
192
+ });
149
193
  if (!found || typeof found.size !== 'number')
150
194
  return null;
151
195
  return {
@@ -186,7 +230,7 @@ export function nativeHostEnvironment() {
186
230
  },
187
231
  canShare: () => true,
188
232
  download: (blob, filename) => {
189
- void hostRequest('share', { files: [{ name: filename, type: blob.type, data: base64Encode(blob.bytes()) }] }).catch(() => undefined);
233
+ void hostRequest('share', { files: [{ name: filename, type: blob.type, data: blob.bytes() }] }).catch(() => undefined);
190
234
  },
191
235
  pickFiles: async (options) => filesOf(await hostRequest('pickFiles', { accept: options.accept, multiple: options.multiple })),
192
236
  // `fileExporter`: the document picker, saving the files where the viewer chooses.
@@ -199,7 +243,7 @@ export function nativeHostEnvironment() {
199
243
  writeText: (text) => hostRequest('clipboard', { action: 'write', text }).then(() => undefined),
200
244
  writeImage: async (png) => {
201
245
  const file = await png;
202
- await hostRequest('clipboard', { action: 'write', files: [{ name: 'image.png', type: file.type || 'image/png', data: base64Encode(file.bytes()) }] });
246
+ await hostRequest('clipboard', { action: 'write', files: [{ name: 'image.png', type: file.type || 'image/png', data: file.bytes() }] });
203
247
  },
204
248
  readText: async () => (await hostRequest('clipboard', { action: 'readText' }))?.text ?? '',
205
249
  },
@@ -209,6 +253,14 @@ export function nativeHostEnvironment() {
209
253
  signIn: (options) => hostRequest('appleSignIn', { action: 'signIn', ...options }),
210
254
  credentialState: async (user) => (await hostRequest('appleSignIn', { action: 'credentialState', user }))?.state ?? 'unknown',
211
255
  },
256
+ // `AVAudioEngine` (AudioEngineBridge.swift): the app's engine commands, answered in the order sent.
257
+ audioEngine: {
258
+ perform: (command) => hostRequest('audioEngine', command),
259
+ },
260
+ // Foundation Models (LanguageModelBridge.swift): the app's sessions and streams, a `next` answered as a stream grows.
261
+ languageModel: {
262
+ perform: (command) => hostRequest('languageModel', command),
263
+ },
212
264
  // `AVAudioRecorder` (AudioRecorderBridge.swift): a recording ends as a file URL in Documents; `trim` writes another.
213
265
  audioRecorder: {
214
266
  start: () => hostRequest('audioRecord', { action: 'start' }).then(() => undefined),
@@ -1 +1 @@
1
- {"version":3,"file":"hostRequests.js","sourceRoot":"","sources":["../src/hostRequests.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hostRequests.js","sourceRoot":"","sources":["../src/hostRequests.ts"],"names":[],"mappings":"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"}
package/dist/ios.d.ts ADDED
@@ -0,0 +1,79 @@
1
+ /**
2
+ * What a CI job needs to hand an app's iOS build to phones, outside Xcode:
3
+ * an ad hoc provisioning profile made fresh through the App Store Connect
4
+ * API, and the over-the-air install page around the exported IPA. The
5
+ * reusable workflows (.github/workflows/sb-ios-adhoc.yml in the SwiftBrowser
6
+ * repository) run them as `swiftbrowser-native ios-profile` and
7
+ * `swiftbrowser-native ios-install-page`, from the app's own
8
+ * node_modules, so they come at the version of the app's @swiftbrowser
9
+ * packages.
10
+ */
11
+ export interface AppStoreConnectKey {
12
+ /** The key's ID (ASC_KEY_ID). */
13
+ keyId: string;
14
+ /** The team's issuer ID (ASC_ISSUER_ID). */
15
+ issuer: string;
16
+ /** The .p8 key's text (ASC_KEY_P8). It needs the Admin or App Manager role. */
17
+ key: string;
18
+ }
19
+ export interface AdhocProfileOptions extends AppStoreConnectKey {
20
+ bundleId: string;
21
+ /** The profile's name, which the archive's PROVISIONING_PROFILE_SPECIFIER names. */
22
+ profileName: string;
23
+ /** The app's name, for the bundle ID when the team has none yet. */
24
+ appName: string;
25
+ /** Where profiles are installed; the user's home by default. */
26
+ home?: string;
27
+ /** For tests. */
28
+ fetch?: typeof fetch;
29
+ log?: (line: string) => void;
30
+ }
31
+ export interface AdhocProfile {
32
+ uuid: string;
33
+ /** The files written, one per folder Xcode reads profiles from. */
34
+ files: string[];
35
+ devices: string[];
36
+ certificates: number;
37
+ }
38
+ /** A JWT for the App Store Connect API, good for 20 minutes. */
39
+ export declare function appStoreConnectToken({ keyId, issuer, key }: AppStoreConnectKey, now?: number): string;
40
+ /**
41
+ * Makes the ad hoc profile `profileName` for `bundleId` again, with every
42
+ * enabled iOS device and every valid distribution certificate of the team,
43
+ * so a phone registered since the last build is in the next one: registers
44
+ * the bundle ID when the team has none, deletes the profile of that name if
45
+ * there is one, and installs the new one where Xcode looks.
46
+ */
47
+ export declare function makeAdhocProfile(options: AdhocProfileOptions): Promise<AdhocProfile>;
48
+ export interface InstallPageOptions {
49
+ /** The exported IPA. */
50
+ ipa: string;
51
+ /** Where the page will be served from (`https://ios.app.pages.dev`): the manifest names the IPA there. */
52
+ url: string;
53
+ bundleId: string;
54
+ /** The build's version (`1.0.42`), its CFBundleVersion. */
55
+ version: string;
56
+ /** The app's name on the page and in the install prompt; the IPA's name by default. */
57
+ title?: string;
58
+ /** The same app in the browser, linked from the page. */
59
+ web?: string;
60
+ /** The commit it was built from. */
61
+ commit?: string;
62
+ /** When it was built; now by default. */
63
+ built?: Date;
64
+ }
65
+ /** The itms-services manifest for an IPA served at `ipaUrl`. */
66
+ export declare function installManifest({ ipaUrl, bundleId, version, title }: {
67
+ ipaUrl: string;
68
+ bundleId: string;
69
+ version: string;
70
+ title: string;
71
+ }): string;
72
+ /**
73
+ * Writes the install page into `outDir`: the IPA, its manifest, an
74
+ * `index.html` whose button installs it over the air (on a phone the
75
+ * profile names), and the `_headers` Cloudflare Pages serves them with.
76
+ * Returns the files written, relative to `outDir`.
77
+ */
78
+ export declare function writeInstallPage(outDir: string, options: InstallPageOptions): string[];
79
+ //# sourceMappingURL=ios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../src/ios.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,kBAAkB,EAAE,GAAG,SAAa,GAAG,MAAM,CAMzG;AAOD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiF1F;AAED,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,0GAA0G;IAC1G,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,KAAK,CAAC,EAAE,IAAI,CAAC;CACd;AAID,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAgBlJ;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAyDtF"}
package/dist/ios.js ADDED
@@ -0,0 +1,181 @@
1
+ /**
2
+ * What a CI job needs to hand an app's iOS build to phones, outside Xcode:
3
+ * an ad hoc provisioning profile made fresh through the App Store Connect
4
+ * API, and the over-the-air install page around the exported IPA. The
5
+ * reusable workflows (.github/workflows/sb-ios-adhoc.yml in the SwiftBrowser
6
+ * repository) run them as `swiftbrowser-native ios-profile` and
7
+ * `swiftbrowser-native ios-install-page`, from the app's own
8
+ * node_modules, so they come at the version of the app's @swiftbrowser
9
+ * packages.
10
+ */
11
+ import { sign } from 'node:crypto';
12
+ import { copyFileSync, mkdirSync, writeFileSync } from 'node:fs';
13
+ import { homedir } from 'node:os';
14
+ import { basename, join } from 'node:path';
15
+ /** A JWT for the App Store Connect API, good for 20 minutes. */
16
+ export function appStoreConnectToken({ keyId, issuer, key }, now = Date.now()) {
17
+ const encode = (value) => Buffer.from(JSON.stringify(value)).toString('base64url');
18
+ const seconds = Math.floor(now / 1000);
19
+ const body = `${encode({ alg: 'ES256', kid: keyId, typ: 'JWT' })}.${encode({ iss: issuer, iat: seconds, exp: seconds + 1200, aud: 'appstoreconnect-v1' })}`;
20
+ const signature = sign('sha256', Buffer.from(body), { key, dsaEncoding: 'ieee-p1363' });
21
+ return `${body}.${signature.toString('base64url')}`;
22
+ }
23
+ /**
24
+ * Makes the ad hoc profile `profileName` for `bundleId` again, with every
25
+ * enabled iOS device and every valid distribution certificate of the team,
26
+ * so a phone registered since the last build is in the next one: registers
27
+ * the bundle ID when the team has none, deletes the profile of that name if
28
+ * there is one, and installs the new one where Xcode looks.
29
+ */
30
+ export async function makeAdhocProfile(options) {
31
+ const { bundleId, profileName, appName } = options;
32
+ const request = options.fetch ?? fetch;
33
+ const log = options.log ?? ((line) => console.log(line));
34
+ const authorization = `Bearer ${appStoreConnectToken(options)}`;
35
+ const api = async (method, path, body) => {
36
+ const response = await request(`https://api.appstoreconnect.apple.com${path}`, {
37
+ method,
38
+ headers: { authorization, 'content-type': 'application/json' },
39
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
40
+ });
41
+ const text = await response.text();
42
+ if (!response.ok)
43
+ throw new Error(`${method} ${path}: ${response.status} ${text}`);
44
+ return text ? JSON.parse(text) : null;
45
+ };
46
+ /** Every page of a list. */
47
+ const list = async (path) => {
48
+ const items = [];
49
+ let next = path;
50
+ while (next) {
51
+ const page = await api('GET', next);
52
+ items.push(...(page?.data ?? []));
53
+ const link = page?.links?.next;
54
+ next = link ? new URL(link).pathname + new URL(link).search : null;
55
+ }
56
+ return items;
57
+ };
58
+ const query = (params) => new URLSearchParams(params).toString();
59
+ let bundle = (await list(`/v1/bundleIds?${query({ 'filter[identifier]': bundleId, limit: '200' })}`)).find((item) => item.attributes['identifier'] === bundleId);
60
+ if (!bundle) {
61
+ log(`Registering the bundle ID ${bundleId}.`);
62
+ bundle = (await api('POST', '/v1/bundleIds', { data: { type: 'bundleIds', attributes: { identifier: bundleId, name: appName, platform: 'IOS' } } }))
63
+ .data;
64
+ }
65
+ const now = Date.now();
66
+ const certificates = (await list(`/v1/certificates?${query({ 'filter[certificateType]': 'DISTRIBUTION,IOS_DISTRIBUTION', limit: '200' })}`)).filter((item) => !item.attributes['expirationDate'] || Date.parse(item.attributes['expirationDate']) > now);
67
+ if (certificates.length === 0)
68
+ throw new Error('The team has no valid distribution certificate.');
69
+ const devices = await list(`/v1/devices?${query({ 'filter[platform]': 'IOS', 'filter[status]': 'ENABLED', limit: '200' })}`);
70
+ if (devices.length === 0)
71
+ throw new Error('The team has no enabled iOS devices: an ad hoc profile needs at least one.');
72
+ for (const old of await list(`/v1/profiles?${query({ 'filter[name]': profileName, limit: '200' })}`)) {
73
+ if (old.attributes['name'] !== profileName)
74
+ continue;
75
+ log(`Deleting the old profile ${old.id}.`);
76
+ await api('DELETE', `/v1/profiles/${old.id}`);
77
+ }
78
+ const profile = (await api('POST', '/v1/profiles', {
79
+ data: {
80
+ type: 'profiles',
81
+ attributes: { name: profileName, profileType: 'IOS_APP_ADHOC' },
82
+ relationships: {
83
+ bundleId: { data: { type: 'bundleIds', id: bundle.id } },
84
+ certificates: { data: certificates.map((item) => ({ type: 'certificates', id: item.id })) },
85
+ devices: { data: devices.map((item) => ({ type: 'devices', id: item.id })) },
86
+ },
87
+ },
88
+ })).data;
89
+ const uuid = profile.attributes['uuid'];
90
+ const content = Buffer.from(profile.attributes['profileContent'], 'base64');
91
+ const home = options.home ?? homedir();
92
+ const files = [];
93
+ // Xcode 16 and later read the first; older ones the second.
94
+ for (const dir of [join(home, 'Library/Developer/Xcode/UserData/Provisioning Profiles'), join(home, 'Library/MobileDevice/Provisioning Profiles')]) {
95
+ mkdirSync(dir, { recursive: true });
96
+ const file = join(dir, `${uuid}.mobileprovision`);
97
+ writeFileSync(file, content);
98
+ files.push(file);
99
+ }
100
+ const names = devices.map((device) => `${device.attributes['name']} (${device.attributes['model'] ?? device.attributes['deviceClass']})`);
101
+ log(`Made "${profileName}" (${uuid}) for ${bundleId}: ${devices.length} device(s), ${certificates.length} certificate(s).`);
102
+ for (const name of names)
103
+ log(`- ${name}`);
104
+ return { uuid, files, devices: names, certificates: certificates.length };
105
+ }
106
+ const escapeXml = (text) => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
107
+ /** The itms-services manifest for an IPA served at `ipaUrl`. */
108
+ export function installManifest({ ipaUrl, bundleId, version, title }) {
109
+ return `<?xml version="1.0" encoding="UTF-8"?>
110
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
111
+ <plist version="1.0"><dict><key>items</key><array><dict>
112
+ <key>assets</key><array><dict>
113
+ <key>kind</key><string>software-package</string>
114
+ <key>url</key><string>${escapeXml(ipaUrl)}</string>
115
+ </dict></array>
116
+ <key>metadata</key><dict>
117
+ <key>bundle-identifier</key><string>${escapeXml(bundleId)}</string>
118
+ <key>bundle-version</key><string>${escapeXml(version)}</string>
119
+ <key>kind</key><string>software</string>
120
+ <key>title</key><string>${escapeXml(title)}</string>
121
+ </dict>
122
+ </dict></array></dict></plist>
123
+ `;
124
+ }
125
+ /**
126
+ * Writes the install page into `outDir`: the IPA, its manifest, an
127
+ * `index.html` whose button installs it over the air (on a phone the
128
+ * profile names), and the `_headers` Cloudflare Pages serves them with.
129
+ * Returns the files written, relative to `outDir`.
130
+ */
131
+ export function writeInstallPage(outDir, options) {
132
+ const ipaName = basename(options.ipa);
133
+ const title = options.title ?? ipaName.replace(/\.ipa$/, '');
134
+ const base = options.url.replace(/\/+$/, '');
135
+ const built = (options.built ?? new Date()).toISOString().replace('T', ' ').slice(0, 16) + ' UTC';
136
+ const html = (text) => escapeXml(text);
137
+ mkdirSync(outDir, { recursive: true });
138
+ copyFileSync(options.ipa, join(outDir, ipaName));
139
+ writeFileSync(join(outDir, 'manifest.plist'), installManifest({ ipaUrl: `${base}/${ipaName}`, bundleId: options.bundleId, version: options.version, title }));
140
+ writeFileSync(join(outDir, '_headers'), `/manifest.plist
141
+ Content-Type: application/xml
142
+ Cache-Control: no-store
143
+ /${ipaName}
144
+ Content-Type: application/octet-stream
145
+ Cache-Control: no-store
146
+ `);
147
+ const install = `itms-services://?action=download-manifest&url=${base}/manifest.plist`;
148
+ writeFileSync(join(outDir, 'index.html'), `<!doctype html>
149
+ <html lang="en">
150
+ <head>
151
+ <meta charset="utf-8" />
152
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
153
+ <meta name="color-scheme" content="light dark" />
154
+ <title>Install ${html(title)}</title>
155
+ <style>
156
+ :root { --bg: #f2f2f7; --card: #fff; --fg: #000; --muted: #6e6e73; --tint: #007aff; }
157
+ @media (prefers-color-scheme: dark) { :root { --bg: #000; --card: #1c1c1e; --fg: #fff; --muted: #98989f; --tint: #0a84ff; } }
158
+ * { box-sizing: border-box; }
159
+ body { margin: 0; min-height: 100vh; display: grid; place-items: center; padding: 24px 16px;
160
+ background: var(--bg); color: var(--fg); font: 17px/1.4 -apple-system, BlinkMacSystemFont, system-ui, sans-serif; }
161
+ main { width: 100%; max-width: 420px; background: var(--card); border-radius: 22px; padding: 28px 24px; text-align: center; }
162
+ h1 { font-size: 28px; margin: 0 0 4px; }
163
+ p { color: var(--muted); margin: 8px 0; font-size: 15px; }
164
+ a.install { display: block; margin: 24px 0 16px; padding: 14px; border-radius: 14px; background: var(--tint);
165
+ color: #fff; font-weight: 600; text-decoration: none; }
166
+ a { color: var(--tint); }
167
+ </style>
168
+ </head>
169
+ <body>
170
+ <main>
171
+ <h1>${html(title)}</h1>
172
+ <p>Version ${html(options.version)} · built ${built}${options.commit ? ` from ${html(options.commit.slice(0, 7))}` : ''}</p>
173
+ <a class="install" href="${html(install)}">Install on this iPhone</a>
174
+ <p>Open this page in Safari on an iPhone whose device is registered with the team: an ad hoc build installs only on the devices its profile names. After installing, open Settings → General → VPN &amp; Device Management if iOS asks you to trust the developer.</p>${options.web ? `\n <p><a href="${html(options.web)}">Try it in the browser</a></p>` : ''}
175
+ </main>
176
+ </body>
177
+ </html>
178
+ `);
179
+ return [ipaName, 'manifest.plist', '_headers', 'index.html'];
180
+ }
181
+ //# sourceMappingURL=ios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios.js","sourceRoot":"","sources":["../src/ios.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAsB3D,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAQzC,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAE,SAA8C,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,EAAE,CAoSnJ"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAsB3D,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAQzC,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAE,SAA8C,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,EAAE,CAmTnJ"}
package/dist/runtime.js CHANGED
@@ -32,7 +32,7 @@
32
32
  * here.
33
33
  */
34
34
  import { nativeBridge } from './bridge';
35
- import { atobPolyfill, base64Decode, btoaPolyfill, SimpleTextDecoder, SimpleTextEncoder } from './encoding';
35
+ import { atobPolyfill, base64Decode, btoaPolyfill, installNativeUTF8, SimpleTextDecoder, SimpleTextEncoder } from './encoding';
36
36
  import { createFetch } from './fetch';
37
37
  import { createImageGlobals } from './image';
38
38
  import { SimpleURL, SimpleURLSearchParams } from './url';
@@ -172,7 +172,12 @@ export function installRuntime(native, target = globalThis, options = {}) {
172
172
  define('TextDecoder', SimpleTextDecoder);
173
173
  define('atob', atobPolyfill);
174
174
  define('btoa', btoaPolyfill);
175
- const fetchGlobals = createFetch(native);
175
+ // Typed arrays beside the JSON both ways (docs/notes/bytes.md): a host with
176
+ // `hostRequestBytes` carries them for fetch, sockets and files alike.
177
+ const carriesBytes = typeof native.hostRequestBytes === 'function';
178
+ // UTF-8 on the host past a few dozen characters (encoding.ts).
179
+ installNativeUTF8(native.decodeUTF8 && native.encodeUTF8 ? { decode: native.decodeUTF8.bind(native), encode: native.encodeUTF8.bind(native) } : null);
180
+ const fetchGlobals = createFetch(native, { bytes: carriesBytes });
176
181
  define('fetch', fetchGlobals.fetch);
177
182
  define('Headers', fetchGlobals.Headers);
178
183
  define('Request', fetchGlobals.Request);
@@ -192,11 +197,11 @@ export function installRuntime(native, target = globalThis, options = {}) {
192
197
  urlStatics.createObjectURL = (blob) => objectURL(blob);
193
198
  urlStatics.revokeObjectURL = () => { };
194
199
  }
195
- const random = (count) => base64Decode(native.randomBytes(count));
200
+ const random = (count) => (native.randomValues ? native.randomValues(count) : base64Decode(native.randomBytes(count)));
196
201
  setBodyRandomness(random);
197
202
  // WebSockets (webSocket.ts) over the host's `URLSessionWebSocketTask`.
198
203
  if (native.wsOpen && native.wsSend && native.wsClose) {
199
- NativeWebSocket.install({ wsOpen: native.wsOpen.bind(native), wsSend: native.wsSend.bind(native), wsClose: native.wsClose.bind(native) });
204
+ NativeWebSocket.install({ wsOpen: native.wsOpen.bind(native), wsSend: native.wsSend.bind(native), wsClose: native.wsClose.bind(native) }, { bytes: carriesBytes });
200
205
  define('WebSocket', NativeWebSocket);
201
206
  define('__sbWebSocketEvent', NativeWebSocket.receive);
202
207
  }
@@ -204,7 +209,11 @@ export function installRuntime(native, target = globalThis, options = {}) {
204
209
  define('matchMedia', matchMedia);
205
210
  // Host requests (hostRequests.ts): the share sheet, the pickers, the pasteboard, a sign-in.
206
211
  if (native.hostRequest && !native.workerPostMessage) {
207
- installHostRequests({ hostRequest: native.hostRequest.bind(native), ...(native.appDirectories ? { appDirectories: native.appDirectories.bind(native) } : {}) });
212
+ installHostRequests({
213
+ hostRequest: native.hostRequest.bind(native),
214
+ ...(native.hostRequestBytes ? { hostRequestBytes: native.hostRequestBytes.bind(native) } : {}),
215
+ ...(native.appDirectories ? { appDirectories: native.appDirectories.bind(native) } : {}),
216
+ });
208
217
  define('__sbHostResponse', receiveHostResponse);
209
218
  define('__sbFilesChanged', receiveFilesChanged);
210
219
  // The escape hatch's functions (nativeFunctions.ts): `callNative` rides `hostRequest`.
@@ -235,14 +244,14 @@ export function installRuntime(native, target = globalThis, options = {}) {
235
244
  }
236
245
  define('crypto', {
237
246
  getRandomValues: (array) => {
238
- const bytes = base64Decode(native.randomBytes(array.byteLength));
247
+ const bytes = random(array.byteLength);
239
248
  new Uint8Array(array.buffer, array.byteOffset, array.byteLength).set(bytes.subarray(0, array.byteLength));
240
249
  return array;
241
250
  },
242
251
  // Digests and HMAC on the host's CryptoKit (subtle.ts).
243
252
  subtle: createSubtleCrypto(native),
244
253
  randomUUID: () => {
245
- const bytes = base64Decode(native.randomBytes(16));
254
+ const bytes = new Uint8Array(random(16));
246
255
  bytes[6] = (bytes[6] & 0x0f) | 0x40;
247
256
  bytes[8] = (bytes[8] & 0x3f) | 0x80;
248
257
  const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');