@swiftbrowser/native 0.0.0-stage → 0.10.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 (107) hide show
  1. package/README.md +143 -2
  2. package/bin/swiftbrowser-native.mjs +49 -0
  3. package/dist/bridge.d.ts +50 -0
  4. package/dist/bridge.d.ts.map +1 -0
  5. package/dist/bridge.js +10 -0
  6. package/dist/bridge.js.map +1 -0
  7. package/dist/build.d.ts +47 -0
  8. package/dist/build.d.ts.map +1 -0
  9. package/dist/build.js +156 -0
  10. package/dist/build.js.map +1 -0
  11. package/dist/devBuild.d.ts +34 -0
  12. package/dist/devBuild.d.ts.map +1 -0
  13. package/dist/devBuild.js +133 -0
  14. package/dist/devBuild.js.map +1 -0
  15. package/dist/encoding.d.ts +32 -0
  16. package/dist/encoding.d.ts.map +1 -0
  17. package/dist/encoding.js +136 -0
  18. package/dist/encoding.js.map +1 -0
  19. package/dist/fetch.d.ts +117 -0
  20. package/dist/fetch.d.ts.map +1 -0
  21. package/dist/fetch.js +272 -0
  22. package/dist/fetch.js.map +1 -0
  23. package/dist/index.d.ts +20 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +20 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/native.d.ts +19 -0
  28. package/dist/native.d.ts.map +1 -0
  29. package/dist/native.js +17 -0
  30. package/dist/native.js.map +1 -0
  31. package/dist/refresh.d.ts +18 -0
  32. package/dist/refresh.d.ts.map +1 -0
  33. package/dist/refresh.js +18 -0
  34. package/dist/refresh.js.map +1 -0
  35. package/dist/run.d.ts +27 -0
  36. package/dist/run.d.ts.map +1 -0
  37. package/dist/run.js +76 -0
  38. package/dist/run.js.map +1 -0
  39. package/dist/runtime.d.ts +30 -0
  40. package/dist/runtime.d.ts.map +1 -0
  41. package/dist/runtime.js +193 -0
  42. package/dist/runtime.js.map +1 -0
  43. package/dist/stubs/react-dom-client.d.ts +8 -0
  44. package/dist/stubs/react-dom-client.d.ts.map +1 -0
  45. package/dist/stubs/react-dom-client.js +11 -0
  46. package/dist/stubs/react-dom-client.js.map +1 -0
  47. package/dist/stubs/react-dom.d.ts +9 -0
  48. package/dist/stubs/react-dom.d.ts.map +1 -0
  49. package/dist/stubs/react-dom.js +13 -0
  50. package/dist/stubs/react-dom.js.map +1 -0
  51. package/dist/url.d.ts +48 -0
  52. package/dist/url.d.ts.map +1 -0
  53. package/dist/url.js +213 -0
  54. package/dist/url.js.map +1 -0
  55. package/dist/vendor.d.ts +11 -0
  56. package/dist/vendor.d.ts.map +1 -0
  57. package/dist/vendor.js +27 -0
  58. package/dist/vendor.js.map +1 -0
  59. package/dist/wasmHost.d.ts +35 -0
  60. package/dist/wasmHost.d.ts.map +1 -0
  61. package/dist/wasmHost.js +120 -0
  62. package/dist/wasmHost.js.map +1 -0
  63. package/package.json +73 -4
  64. package/src/bridge.ts +58 -0
  65. package/src/build.ts +185 -0
  66. package/src/devBuild.ts +152 -0
  67. package/src/encoding.ts +130 -0
  68. package/src/fetch.ts +305 -0
  69. package/src/index.ts +20 -0
  70. package/src/native.ts +35 -0
  71. package/src/refresh.ts +29 -0
  72. package/src/run.ts +98 -0
  73. package/src/runtime.ts +208 -0
  74. package/src/stubs/react-dom-client.ts +17 -0
  75. package/src/stubs/react-dom.ts +15 -0
  76. package/src/types/react-refresh.d.ts +38 -0
  77. package/src/url.ts +202 -0
  78. package/src/vendor.ts +30 -0
  79. package/src/wasmHost.ts +147 -0
  80. package/swift/Package.swift +31 -0
  81. package/swift/Sources/SwiftBrowserNative/Host/HostBridge.swift +228 -0
  82. package/swift/Sources/SwiftBrowserNative/Host/JSHost.swift +42 -0
  83. package/swift/Sources/SwiftBrowserNative/Host/JavaScriptCoreHost.swift +102 -0
  84. package/swift/Sources/SwiftBrowserNative/Host/ShimAliases.swift +25 -0
  85. package/swift/Sources/SwiftBrowserNative/Host/WebHost.swift +138 -0
  86. package/swift/Sources/SwiftBrowserNative/Runtime/NativeApp.swift +251 -0
  87. package/swift/Sources/SwiftBrowserNative/Runtime/NativeRegistry.swift +53 -0
  88. package/swift/Sources/SwiftBrowserNative/SwiftBrowserNative.swift +6 -0
  89. package/swift/Sources/SwiftBrowserNative/Views/Conversions.swift +361 -0
  90. package/swift/Sources/SwiftBrowserNative/Views/ElementView.swift +169 -0
  91. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Controls.swift +268 -0
  92. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Lists.swift +175 -0
  93. package/swift/Sources/SwiftBrowserNative/Views/Kinds/More.swift +196 -0
  94. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Navigation.swift +246 -0
  95. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Shapes.swift +108 -0
  96. package/swift/Sources/SwiftBrowserNative/Views/Kinds/Stacks.swift +189 -0
  97. package/swift/Sources/SwiftBrowserNative/Views/Kinds/TextAndImages.swift +102 -0
  98. package/swift/Sources/SwiftBrowserNative/Views/NativeRootView.swift +190 -0
  99. package/swift/Sources/SwiftBrowserNative/Views/StyleModifier.swift +182 -0
  100. package/swift/Sources/SwiftBrowserProtocol/JSONValue.swift +268 -0
  101. package/swift/Sources/SwiftBrowserProtocol/Op.swift +100 -0
  102. package/swift/Sources/SwiftBrowserProtocol/Props.swift +469 -0
  103. package/swift/Sources/SwiftBrowserProtocol/RendererEvent.swift +117 -0
  104. package/swift/Sources/SwiftBrowserProtocol/Style.swift +148 -0
  105. package/swift/Sources/SwiftBrowserProtocol/Values.swift +279 -0
  106. package/swift/Sources/SwiftBrowserTree/ElementNode.swift +65 -0
  107. package/swift/Sources/SwiftBrowserTree/OpTree.swift +168 -0
package/dist/url.js ADDED
@@ -0,0 +1,213 @@
1
+ /**
2
+ * `URL` and `URLSearchParams` for an engine without them. Enough for what
3
+ * apps and libraries do with them (build and read absolute URLs, query
4
+ * strings); not the whole WHATWG parser: no IDNA, no percent-encoding
5
+ * normalization beyond `encodeURIComponent` in the search params.
6
+ */
7
+ export class SimpleURLSearchParams {
8
+ entries = [];
9
+ /** Called when the params change, so an owning URL updates its `search`. */
10
+ onChange = null;
11
+ constructor(init = '') {
12
+ if (typeof init === 'string') {
13
+ const text = init.startsWith('?') ? init.slice(1) : init;
14
+ for (const part of text.split('&')) {
15
+ if (!part)
16
+ continue;
17
+ const at = part.indexOf('=');
18
+ const key = at < 0 ? part : part.slice(0, at);
19
+ const value = at < 0 ? '' : part.slice(at + 1);
20
+ this.entries.push([decodeComponent(key), decodeComponent(value)]);
21
+ }
22
+ }
23
+ else if (init instanceof SimpleURLSearchParams) {
24
+ this.entries = init.entries.map(([k, v]) => [k, v]);
25
+ }
26
+ else if (Array.isArray(init)) {
27
+ this.entries = init.map(([k, v]) => [String(k), String(v)]);
28
+ }
29
+ else {
30
+ this.entries = Object.entries(init).map(([k, v]) => [k, String(v)]);
31
+ }
32
+ }
33
+ get size() {
34
+ return this.entries.length;
35
+ }
36
+ append(name, value) {
37
+ this.entries.push([name, String(value)]);
38
+ this.onChange?.();
39
+ }
40
+ delete(name) {
41
+ this.entries = this.entries.filter(([k]) => k !== name);
42
+ this.onChange?.();
43
+ }
44
+ get(name) {
45
+ return this.entries.find(([k]) => k === name)?.[1] ?? null;
46
+ }
47
+ getAll(name) {
48
+ return this.entries.filter(([k]) => k === name).map(([, v]) => v);
49
+ }
50
+ has(name) {
51
+ return this.entries.some(([k]) => k === name);
52
+ }
53
+ set(name, value) {
54
+ const index = this.entries.findIndex(([k]) => k === name);
55
+ if (index < 0)
56
+ this.entries.push([name, String(value)]);
57
+ else {
58
+ this.entries[index] = [name, String(value)];
59
+ this.entries = this.entries.filter(([k], i) => k !== name || i === index);
60
+ }
61
+ this.onChange?.();
62
+ }
63
+ sort() {
64
+ this.entries.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
65
+ this.onChange?.();
66
+ }
67
+ forEach(callback) {
68
+ for (const [k, v] of this.entries)
69
+ callback(v, k, this);
70
+ }
71
+ keys() {
72
+ return this.entries.map(([k]) => k)[Symbol.iterator]();
73
+ }
74
+ values() {
75
+ return this.entries.map(([, v]) => v)[Symbol.iterator]();
76
+ }
77
+ [Symbol.iterator]() {
78
+ return this.entries.map(([k, v]) => [k, v])[Symbol.iterator]();
79
+ }
80
+ toString() {
81
+ return this.entries.map(([k, v]) => `${encodeComponent(k)}=${encodeComponent(v)}`).join('&');
82
+ }
83
+ }
84
+ function encodeComponent(value) {
85
+ return encodeURIComponent(value).replace(/%20/g, '+');
86
+ }
87
+ function decodeComponent(value) {
88
+ try {
89
+ return decodeURIComponent(value.replace(/\+/g, ' '));
90
+ }
91
+ catch {
92
+ return value;
93
+ }
94
+ }
95
+ const URL_PATTERN = /^([a-zA-Z][a-zA-Z0-9+.-]*):(?:\/\/(?:([^@/?#]*)@)?([^:/?#]*)(?::(\d+))?)?([^?#]*)(\?[^#]*)?(#.*)?$/;
96
+ const DEFAULT_PORTS = { 'http:': '80', 'https:': '443', 'ws:': '80', 'wss:': '443', 'ftp:': '21' };
97
+ export class SimpleURL {
98
+ protocol = '';
99
+ username = '';
100
+ password = '';
101
+ hostname = '';
102
+ port = '';
103
+ pathname = '';
104
+ hash = '';
105
+ searchParams;
106
+ _search = '';
107
+ constructor(url, base) {
108
+ let text = String(url);
109
+ if (!URL_PATTERN.test(text) || /^[a-zA-Z][a-zA-Z0-9+.-]*:(?!\/\/)/.test(text) === false && !/^[a-zA-Z]/.test(text)) {
110
+ if (base === undefined)
111
+ throw new TypeError(`Invalid URL: ${text}`);
112
+ text = resolve(text, base instanceof SimpleURL ? base.href : String(base));
113
+ }
114
+ else if (!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(text)) {
115
+ if (base === undefined)
116
+ throw new TypeError(`Invalid URL: ${text}`);
117
+ text = resolve(text, base instanceof SimpleURL ? base.href : String(base));
118
+ }
119
+ const match = URL_PATTERN.exec(text);
120
+ if (!match)
121
+ throw new TypeError(`Invalid URL: ${text}`);
122
+ const [, scheme, auth, host, port, path, search, hash] = match;
123
+ this.protocol = `${scheme.toLowerCase()}:`;
124
+ if (auth !== undefined) {
125
+ const at = auth.indexOf(':');
126
+ this.username = at < 0 ? auth : auth.slice(0, at);
127
+ this.password = at < 0 ? '' : auth.slice(at + 1);
128
+ }
129
+ this.hostname = (host ?? '').toLowerCase();
130
+ this.port = port !== undefined && DEFAULT_PORTS[this.protocol] !== port ? port : '';
131
+ this.pathname = path || (host !== undefined ? '/' : '');
132
+ this._search = search && search !== '?' ? search : '';
133
+ this.hash = hash && hash !== '#' ? hash : '';
134
+ this.searchParams = new SimpleURLSearchParams(this._search);
135
+ this.searchParams.onChange = () => {
136
+ const text = this.searchParams.toString();
137
+ this._search = text ? `?${text}` : '';
138
+ };
139
+ }
140
+ get search() {
141
+ return this._search;
142
+ }
143
+ set search(value) {
144
+ const text = value.startsWith('?') ? value : value ? `?${value}` : '';
145
+ this._search = text === '?' ? '' : text;
146
+ const next = new SimpleURLSearchParams(this._search);
147
+ // Replace the entries in place so the same object keeps working.
148
+ this.searchParams.entries = [...next];
149
+ }
150
+ get host() {
151
+ return this.port ? `${this.hostname}:${this.port}` : this.hostname;
152
+ }
153
+ set host(value) {
154
+ const at = value.indexOf(':');
155
+ this.hostname = at < 0 ? value : value.slice(0, at);
156
+ this.port = at < 0 ? '' : value.slice(at + 1);
157
+ }
158
+ get origin() {
159
+ return this.hostname ? `${this.protocol}//${this.host}` : 'null';
160
+ }
161
+ get href() {
162
+ const auth = this.username ? `${this.username}${this.password ? `:${this.password}` : ''}@` : '';
163
+ const authority = this.hostname || this.protocol === 'file:' ? `//${auth}${this.host}` : '';
164
+ return `${this.protocol}${authority}${this.pathname}${this._search}${this.hash}`;
165
+ }
166
+ set href(value) {
167
+ const next = new SimpleURL(value);
168
+ Object.assign(this, { protocol: next.protocol, username: next.username, password: next.password, hostname: next.hostname, port: next.port, pathname: next.pathname, hash: next.hash });
169
+ this.search = next.search;
170
+ }
171
+ toString() {
172
+ return this.href;
173
+ }
174
+ toJSON() {
175
+ return this.href;
176
+ }
177
+ static canParse(url, base) {
178
+ try {
179
+ new SimpleURL(url, base);
180
+ return true;
181
+ }
182
+ catch {
183
+ return false;
184
+ }
185
+ }
186
+ }
187
+ /** Resolves a relative reference against a base (RFC 3986 section 5.2, the common cases). */
188
+ function resolve(reference, base) {
189
+ const b = new SimpleURL(base);
190
+ if (reference.startsWith('//'))
191
+ return `${b.protocol}${reference}`;
192
+ if (reference.startsWith('/'))
193
+ return `${b.origin}${reference}`;
194
+ if (reference.startsWith('?'))
195
+ return `${b.origin}${b.pathname}${reference}`;
196
+ if (reference.startsWith('#'))
197
+ return `${b.origin}${b.pathname}${b.search}${reference}`;
198
+ if (reference === '')
199
+ return `${b.origin}${b.pathname}${b.search}`;
200
+ const directory = b.pathname.slice(0, b.pathname.lastIndexOf('/') + 1);
201
+ const segments = [];
202
+ for (const segment of `${directory}${reference}`.split('/')) {
203
+ if (segment === '..')
204
+ segments.pop();
205
+ else if (segment !== '.')
206
+ segments.push(segment);
207
+ }
208
+ let path = segments.join('/');
209
+ if (!path.startsWith('/'))
210
+ path = `/${path}`;
211
+ return `${b.origin}${path}`;
212
+ }
213
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The vendor half of the dev bundle (devBuild.ts): the runtime, React Fast
3
+ * Refresh's runtime (before React), React, `@swiftbrowser/react` and this
4
+ * package, evaluated once. The app half is built against shims that read
5
+ * these from `__sbVendor`, so re-evaluating it on a save keeps one React and
6
+ * refreshes the mounted components in place.
7
+ */
8
+ import './runtime';
9
+ import './refresh';
10
+ export declare const vendor: Record<string, unknown>;
11
+ //# sourceMappingURL=vendor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor.d.ts","sourceRoot":"","sources":["../src/vendor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,WAAW,CAAC;AACnB,OAAO,WAAW,CAAC;AAYnB,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAM1C,CAAC"}
package/dist/vendor.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The vendor half of the dev bundle (devBuild.ts): the runtime, React Fast
3
+ * Refresh's runtime (before React), React, `@swiftbrowser/react` and this
4
+ * package, evaluated once. The app half is built against shims that read
5
+ * these from `__sbVendor`, so re-evaluating it on a save keeps one React and
6
+ * refreshes the mounted components in place.
7
+ */
8
+ import './runtime';
9
+ import './refresh';
10
+ import * as React from 'react';
11
+ import * as JSXDevRuntime from 'react/jsx-dev-runtime';
12
+ import * as JSXRuntime from 'react/jsx-runtime';
13
+ import * as SwiftBrowserReact from '@swiftbrowser/react';
14
+ import { injectIntoDevTools } from '@swiftbrowser/react';
15
+ import * as Native from './index';
16
+ // The reconciler tells the DevTools hook (which the refresh runtime installed)
17
+ // about itself, which is how Fast Refresh reaches the mounted roots.
18
+ injectIntoDevTools();
19
+ export const vendor = {
20
+ react: React,
21
+ 'react/jsx-runtime': JSXRuntime,
22
+ 'react/jsx-dev-runtime': JSXDevRuntime,
23
+ '@swiftbrowser/react': SwiftBrowserReact,
24
+ '@swiftbrowser/native': Native,
25
+ };
26
+ globalThis.__sbVendor = vendor;
27
+ //# sourceMappingURL=vendor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor.js","sourceRoot":"","sources":["../src/vendor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,WAAW,CAAC;AACnB,OAAO,WAAW,CAAC;AACnB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,iBAAiB,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAElC,+EAA+E;AAC/E,qEAAqE;AACrE,kBAAkB,EAAE,CAAC;AAErB,MAAM,CAAC,MAAM,MAAM,GAA4B;IAC7C,KAAK,EAAE,KAAK;IACZ,mBAAmB,EAAE,UAAU;IAC/B,uBAAuB,EAAE,aAAa;IACtC,qBAAqB,EAAE,iBAAiB;IACxC,sBAAsB,EAAE,MAAM;CAC/B,CAAC;AAED,UAAuD,CAAC,UAAU,GAAG,MAAM,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The host's JavaScript as SwiftBrowser Native's engine (docs/native.md,
3
+ * "The round trip"): for a module built with the round-trip target
4
+ * (`Native/RoundTrip`, the native views compiled against the shim), this
5
+ * answers its one import, `sb_native.request`, and exposes the native
6
+ * functions Swift installs (`applyOps`, `log`, `now`, …) on `__sbNative`,
7
+ * each a call of the module's `sb_native_invoke` export.
8
+ *
9
+ * Node (scripts/run-wasi.mjs) and a page use it the same way: merge
10
+ * `imports` into the module's imports, instantiate, then `attach` the
11
+ * instance. Strings cross linear memory as UTF-8; an answer to Swift is a
12
+ * buffer from `sb_alloc` holding a little-endian 4-byte length and the
13
+ * bytes, which Swift frees, and a result from Swift is the same layout,
14
+ * freed with `sb_native_free` once read.
15
+ */
16
+ export interface WasmNativeHostOptions {
17
+ /** Runs a script at the global scope (default: an indirect `eval`). */
18
+ evaluate?: (script: string, name: string) => void;
19
+ /** The global object the bundle's globals live on (default `globalThis`). */
20
+ global?: Record<string, unknown>;
21
+ }
22
+ export interface WasmNativeHost {
23
+ /** Merge into the module's import object before instantiating. */
24
+ imports: {
25
+ sb_native: {
26
+ request: (kind: number, kindLength: number, a: number, aLength: number, b: number, bLength: number) => number;
27
+ };
28
+ };
29
+ /** The instance, once instantiated: its memory and the exports the host calls. */
30
+ attach(instance: WebAssembly.Instance): void;
31
+ /** The `__sbNative` object as it stands (replaced by a reset). */
32
+ readonly native: Record<string, (...args: unknown[]) => unknown>;
33
+ }
34
+ export declare function wasmNativeHost(options?: WasmNativeHostOptions): WasmNativeHost;
35
+ //# sourceMappingURL=wasmHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasmHost.d.ts","sourceRoot":"","sources":["../src/wasmHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,OAAO,EAAE;QACP,SAAS,EAAE;YACT,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;SAC/G,CAAC;KACH,CAAC;IACF,kFAAkF;IAClF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC7C,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC;CAClE;AAYD,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAoGlF"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * The host's JavaScript as SwiftBrowser Native's engine (docs/native.md,
3
+ * "The round trip"): for a module built with the round-trip target
4
+ * (`Native/RoundTrip`, the native views compiled against the shim), this
5
+ * answers its one import, `sb_native.request`, and exposes the native
6
+ * functions Swift installs (`applyOps`, `log`, `now`, …) on `__sbNative`,
7
+ * each a call of the module's `sb_native_invoke` export.
8
+ *
9
+ * Node (scripts/run-wasi.mjs) and a page use it the same way: merge
10
+ * `imports` into the module's imports, instantiate, then `attach` the
11
+ * instance. Strings cross linear memory as UTF-8; an answer to Swift is a
12
+ * buffer from `sb_alloc` holding a little-endian 4-byte length and the
13
+ * bytes, which Swift frees, and a result from Swift is the same layout,
14
+ * freed with `sb_native_free` once read.
15
+ */
16
+ /** The globals a bundle defines, dropped by a reset (`JSHost.reset`). */
17
+ const BUNDLE_GLOBALS = ['__sbDispatch', '__sbTimerFired', '__sbFetchResult', '__sbRefresh', '__sbVendor'];
18
+ export function wasmNativeHost(options = {}) {
19
+ const g = options.global ?? globalThis;
20
+ const evaluate = options.evaluate ?? ((script) => (0, eval)(script));
21
+ const encoder = new TextEncoder();
22
+ const decoder = new TextDecoder();
23
+ let exports = null;
24
+ let native = {};
25
+ const need = () => {
26
+ if (!exports)
27
+ throw new Error('wasmNativeHost: attach(instance) before the module runs');
28
+ return exports;
29
+ };
30
+ const read = (pointer, length) => decoder.decode(new Uint8Array(need().memory.buffer, pointer, length));
31
+ /** A buffer from `sb_alloc` with the text's length and bytes; Swift frees it. */
32
+ const answer = (value) => {
33
+ const bytes = encoder.encode(JSON.stringify(value));
34
+ const pointer = need().sb_alloc(bytes.length + 4);
35
+ // The allocation may have grown the memory: take the view after it.
36
+ const view = new DataView(need().memory.buffer);
37
+ view.setUint32(pointer, bytes.length, true);
38
+ new Uint8Array(need().memory.buffer, pointer + 4, bytes.length).set(bytes);
39
+ return pointer;
40
+ };
41
+ const describe = (error) => (error instanceof Error ? (error.stack ?? error.message) : String(error));
42
+ /** A native function's call: into Swift and back with its JSON result. */
43
+ const invoke = (name, args) => {
44
+ const nameBytes = encoder.encode(name);
45
+ const argsBytes = encoder.encode(JSON.stringify(args));
46
+ const namePointer = need().sb_alloc(nameBytes.length || 1);
47
+ new Uint8Array(need().memory.buffer, namePointer, nameBytes.length).set(nameBytes);
48
+ const argsPointer = need().sb_alloc(argsBytes.length || 1);
49
+ new Uint8Array(need().memory.buffer, argsPointer, argsBytes.length).set(argsBytes);
50
+ const result = need().sb_native_invoke(namePointer, nameBytes.length, argsPointer, argsBytes.length);
51
+ if (result === 0)
52
+ return undefined;
53
+ const length = new DataView(need().memory.buffer).getUint32(result, true);
54
+ const text = read(result + 4, length);
55
+ need().sb_native_free(result);
56
+ const value = JSON.parse(text);
57
+ if (value && typeof value === 'object' && 'error' in value && Object.keys(value).length === 1) {
58
+ throw new Error(String(value.error));
59
+ }
60
+ return value;
61
+ };
62
+ const reset = () => {
63
+ for (const name of BUNDLE_GLOBALS)
64
+ delete g[name];
65
+ native = {};
66
+ g['__sbNative'] = native;
67
+ };
68
+ const request = (kind, kindLength, a, aLength, b, bLength) => {
69
+ const what = read(kind, kindLength);
70
+ const first = read(a, aLength);
71
+ const second = read(b, bLength);
72
+ switch (what) {
73
+ case 'reset':
74
+ reset();
75
+ return 0;
76
+ case 'install':
77
+ native[first] = (...args) => invoke(first, args);
78
+ return 0;
79
+ case 'eval':
80
+ try {
81
+ evaluate(first, second);
82
+ return 0;
83
+ }
84
+ catch (error) {
85
+ return answer({ error: describe(error) });
86
+ }
87
+ case 'call': {
88
+ const fn = g[first];
89
+ if (typeof fn !== 'function')
90
+ return answer({ error: `${first} is not defined` });
91
+ try {
92
+ const result = fn(...JSON.parse(second));
93
+ return answer({ ok: result === undefined ? null : result });
94
+ }
95
+ catch (error) {
96
+ return answer({ error: describe(error) });
97
+ }
98
+ }
99
+ case 'has':
100
+ return answer({ ok: first in g });
101
+ default:
102
+ return answer({ error: `unknown request ${what}` });
103
+ }
104
+ };
105
+ reset();
106
+ return {
107
+ imports: { sb_native: { request } },
108
+ attach(instance) {
109
+ for (const name of ['memory', 'sb_alloc', 'sb_native_invoke', 'sb_native_free']) {
110
+ if (!(name in instance.exports))
111
+ throw new Error(`wasmNativeHost: the module does not export ${name}`);
112
+ }
113
+ exports = instance.exports;
114
+ },
115
+ get native() {
116
+ return native;
117
+ },
118
+ };
119
+ }
120
+ //# sourceMappingURL=wasmHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasmHost.js","sourceRoot":"","sources":["../src/wasmHost.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,75 @@
1
1
  {
2
2
  "name": "@swiftbrowser/native",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.10.0",
4
+ "type": "module",
5
+ "description": "Run a @swiftbrowser/react app natively: the runtime a JavaScriptCore-hosted app needs (timers, console, fetch and the other web globals over the SwiftBrowser Native bridge), the `run` entry that renders into the native SwiftUI renderer, and the bundler that builds app.js for the Xcode target.",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/noya-app/SwiftBrowser.git",
9
+ "directory": "packages/native"
10
+ },
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "./runtime": {
19
+ "types": "./dist/runtime.d.ts",
20
+ "default": "./dist/runtime.js"
21
+ },
22
+ "./build": {
23
+ "types": "./dist/build.d.ts",
24
+ "default": "./dist/build.js"
25
+ },
26
+ "./wasm-host": {
27
+ "types": "./dist/wasmHost.d.ts",
28
+ "default": "./dist/wasmHost.js"
29
+ }
30
+ },
31
+ "bin": {
32
+ "swiftbrowser-native": "./bin/swiftbrowser-native.mjs"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "src",
37
+ "bin",
38
+ "swift",
39
+ "README.md"
40
+ ],
41
+ "sideEffects": [
42
+ "./src/runtime.ts",
43
+ "./dist/runtime.js",
44
+ "./src/refresh.ts",
45
+ "./dist/refresh.js",
46
+ "./src/vendor.ts",
47
+ "./dist/vendor.js"
48
+ ],
49
+ "scripts": {
50
+ "build": "tsc --noEmit -p tsconfig.json && tsc -p tsconfig.build.json",
51
+ "typecheck": "tsc --noEmit -p tsconfig.json",
52
+ "test:unit": "vitest run",
53
+ "prepack": "node sync-swift.mjs"
54
+ },
55
+ "dependencies": {
56
+ "@babel/core": "^7.29.7",
57
+ "@swiftbrowser/react": "0.10.0",
58
+ "@swiftbrowser/web": "0.10.0",
59
+ "esbuild": "^0.28.2",
60
+ "react-refresh": "^0.17.0"
61
+ },
62
+ "peerDependencies": {
63
+ "react": "^19.0.0",
64
+ "react-reconciler": "^0.31.0 || ^0.32.0 || ^0.33.0 || ^0.34.0"
65
+ },
66
+ "devDependencies": {
67
+ "@types/node": "^26.6.4",
68
+ "@types/react": "^19.3.0",
69
+ "@types/react-reconciler": "^0.33.1",
70
+ "react": "^19.3.0",
71
+ "react-reconciler": "^0.34.0",
72
+ "typescript": "^5.9.2",
73
+ "vitest": "^5.0.3"
74
+ }
75
+ }
package/src/bridge.ts ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The native side of the bridge, as Swift installs it on `__sbNative`
3
+ * (Native/Sources/SwiftBrowserNative/Host/HostBridge.swift). Every call is
4
+ * synchronous; the ones that answer later do so by calling a global this
5
+ * package defines (`__sbTimerFired`, `__sbFetchResult`).
6
+ */
7
+ export interface NativeBridge {
8
+ /** Applies a render pass's ops (a JSON array). Returns an error message, or nothing. */
9
+ applyOps(json: string): string | null | undefined;
10
+ log(level: string, message: string): void;
11
+ /** Milliseconds, monotonic. */
12
+ now(): number;
13
+ setTimer(id: number, delayMs: number, repeats: boolean): void;
14
+ clearTimer(id: number): void;
15
+ /** Starts a request; the answer arrives at `__sbFetchResult(id, result)`. */
16
+ fetch(id: number, request: string | NativeFetchRequest): void;
17
+ storageGet(key: string): string | null;
18
+ storageSet(key: string, value: string): void;
19
+ storageRemove(key: string): void;
20
+ storageKeys(): string[];
21
+ storageClear(): void;
22
+ /** Base64 of `count` random bytes. */
23
+ randomBytes(count: number): string;
24
+ openURL(url: string): boolean;
25
+ /** The viewer's locale identifier (`en_US`). */
26
+ locale(): string;
27
+ /** The process's launch arguments (`-screen list` from an Xcode scheme or `simctl launch`). */
28
+ launchArguments?(): string[];
29
+ }
30
+
31
+ /** The app's launch arguments, or none outside the native app. */
32
+ export function launchArguments(): string[] {
33
+ const native = nativeBridge();
34
+ return native?.launchArguments?.() ?? [];
35
+ }
36
+
37
+ export interface NativeFetchRequest {
38
+ url: string;
39
+ method: string;
40
+ headers: Record<string, string>;
41
+ /** Base64, or null. */
42
+ body: string | null;
43
+ }
44
+
45
+ export interface NativeFetchResult {
46
+ status?: number;
47
+ statusText?: string;
48
+ headers?: Record<string, string>;
49
+ url?: string;
50
+ /** Base64. */
51
+ body?: string;
52
+ error?: string;
53
+ }
54
+
55
+ /** The host object, or undefined outside the native app (tests, a bundler's dry run). */
56
+ export function nativeBridge(g: typeof globalThis = globalThis): NativeBridge | undefined {
57
+ return (g as unknown as { __sbNative?: NativeBridge }).__sbNative;
58
+ }