webtau 0.5.0-alpha.2 → 0.5.1

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.
@@ -0,0 +1,52 @@
1
+ /**
2
+ * webtau/adapters/electrobun — Electrobun runtime adapter.
3
+ *
4
+ * Implements WindowAdapter, EventAdapter, FsAdapter, and DialogAdapter
5
+ * by delegating each operation to the Electrobun backend via `invoke()`.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * import { bootstrapElectrobun } from "webtau/adapters/electrobun";
10
+ *
11
+ * bootstrapElectrobun();
12
+ * ```
13
+ */
14
+ import type { CoreProvider, DialogAdapter, EventAdapter, FsAdapter, WindowAdapter } from "../provider.js";
15
+ export declare function createElectrobunWindowAdapter(): WindowAdapter;
16
+ export declare function createElectrobunEventAdapter(): EventAdapter;
17
+ /**
18
+ * Dispatch an event from the Electrobun backend to a registered handler.
19
+ * Called by the IPC bridge when the backend pushes an event.
20
+ */
21
+ export declare function dispatchElectrobunEvent(listenerId: number, event: string, payload: unknown): void;
22
+ export declare function createElectrobunFsAdapter(): FsAdapter;
23
+ export declare function createElectrobunDialogAdapter(): DialogAdapter;
24
+ /**
25
+ * Core provider for the Electrobun runtime.
26
+ *
27
+ * Provides the `invoke` and `convertFileSrc` implementations that all
28
+ * adapters delegate through.
29
+ */
30
+ export declare function createElectrobunCoreProvider(): CoreProvider;
31
+ /**
32
+ * Bootstrap all Electrobun adapters at once.
33
+ *
34
+ * Registers the core provider and sets adapters for window, event,
35
+ * filesystem, and dialog modules. After calling this function, all
36
+ * webtau module-level functions will delegate through Electrobun.
37
+ *
38
+ * An optional `coreProvider` can be passed to supply a custom IPC
39
+ * bridge (e.g. one that delegates to `electrobun.ipc.invoke()`).
40
+ *
41
+ * ```ts
42
+ * import { bootstrapElectrobun } from "webtau/adapters/electrobun";
43
+ *
44
+ * bootstrapElectrobun({
45
+ * id: "electrobun",
46
+ * invoke: (cmd, args) => electrobun.ipc.invoke(cmd, args),
47
+ * convertFileSrc: (path) => `electrobun://asset/${path}`,
48
+ * });
49
+ * ```
50
+ */
51
+ export declare function bootstrapElectrobun(coreProvider?: CoreProvider): void;
52
+ //# sourceMappingURL=electrobun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electrobun.d.ts","sourceRoot":"","sources":["../../src/adapters/electrobun.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,SAAS,EACT,aAAa,EACd,MAAM,gBAAgB,CAAC;AAWxB,wBAAgB,6BAA6B,IAAI,aAAa,CA8F7D;AAWD,wBAAgB,4BAA4B,IAAI,YAAY,CAyB3D;AAQD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,IAAI,CAKN;AAYD,wBAAgB,yBAAyB,IAAI,SAAS,CAkErD;AAUD,wBAAgB,6BAA6B,IAAI,aAAa,CAmC7D;AAID;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,YAAY,CAuB3D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAMrE"}
@@ -0,0 +1,290 @@
1
+ /**
2
+ * webtau/adapters/electrobun — Electrobun runtime adapter.
3
+ *
4
+ * Implements WindowAdapter, EventAdapter, FsAdapter, and DialogAdapter
5
+ * by delegating each operation to the Electrobun backend via `invoke()`.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * import { bootstrapElectrobun } from "webtau/adapters/electrobun";
10
+ *
11
+ * bootstrapElectrobun();
12
+ * ```
13
+ */
14
+ import { invoke, registerProvider } from "../core.js";
15
+ import { setDialogAdapter } from "../dialog.js";
16
+ import { setEventAdapter } from "../event.js";
17
+ import { setFsAdapter } from "../fs.js";
18
+ import { setWindowAdapter } from "../window.js";
19
+ // ── Window Adapter ──────────────────────────────────────────────────────────
20
+ // Supported: isFullscreen, setFullscreen, innerSize, outerSize, setSize,
21
+ // title, setTitle, close, minimize, unminimize, maximize,
22
+ // isMaximized, show, hide, setDecorations, scaleFactor,
23
+ // currentMonitor
24
+ // Partial: center (depends on backend window manager support)
25
+ // Unsupported: none currently
26
+ export function createElectrobunWindowAdapter() {
27
+ return {
28
+ async isFullscreen() {
29
+ return invoke("plugin:electrobun|window_is_fullscreen");
30
+ },
31
+ async setFullscreen(fullscreen) {
32
+ await invoke("plugin:electrobun|window_set_fullscreen", { fullscreen });
33
+ },
34
+ async innerSize() {
35
+ return invoke("plugin:electrobun|window_inner_size");
36
+ },
37
+ async outerSize() {
38
+ return invoke("plugin:electrobun|window_outer_size");
39
+ },
40
+ async setSize(size) {
41
+ await invoke("plugin:electrobun|window_set_size", {
42
+ width: size.width,
43
+ height: size.height,
44
+ type: size.type,
45
+ });
46
+ },
47
+ async maximize() {
48
+ await invoke("plugin:electrobun|window_maximize");
49
+ },
50
+ async isMaximized() {
51
+ return invoke("plugin:electrobun|window_is_maximized");
52
+ },
53
+ async title() {
54
+ return invoke("plugin:electrobun|window_title");
55
+ },
56
+ async setTitle(title) {
57
+ await invoke("plugin:electrobun|window_set_title", { title });
58
+ },
59
+ async close() {
60
+ await invoke("plugin:electrobun|window_close");
61
+ },
62
+ async minimize() {
63
+ await invoke("plugin:electrobun|window_minimize");
64
+ },
65
+ async unminimize() {
66
+ await invoke("plugin:electrobun|window_unminimize");
67
+ },
68
+ async show() {
69
+ await invoke("plugin:electrobun|window_show");
70
+ },
71
+ async hide() {
72
+ await invoke("plugin:electrobun|window_hide");
73
+ },
74
+ async setDecorations(decorations) {
75
+ await invoke("plugin:electrobun|window_set_decorations", { decorations });
76
+ },
77
+ // Partial: centering depends on the Electrobun backend's window
78
+ // manager integration. May be a no-op on some platforms.
79
+ async center() {
80
+ await invoke("plugin:electrobun|window_center");
81
+ },
82
+ async currentMonitor() {
83
+ return invoke("plugin:electrobun|window_current_monitor");
84
+ },
85
+ async scaleFactor() {
86
+ return invoke("plugin:electrobun|window_scale_factor");
87
+ },
88
+ };
89
+ }
90
+ // ── Event Adapter ───────────────────────────────────────────────────────────
91
+ // Supported: listen, emit
92
+ // Partial: none
93
+ // Unsupported: none currently
94
+ //
95
+ // Note: The event system relies on the Electrobun backend to manage event
96
+ // subscriptions. The `listen` call returns an unlisten ID that is used to
97
+ // remove the subscription on the backend when `unlisten()` is called.
98
+ export function createElectrobunEventAdapter() {
99
+ return {
100
+ async listen(event, handler) {
101
+ const listenerId = await invoke("plugin:electrobun|event_listen", { event });
102
+ // Register a callback bridge — in a real Electrobun integration this
103
+ // would wire into the IPC message channel. Here we store the handler
104
+ // so the backend can dispatch events to it.
105
+ electrobunEventHandlers.set(listenerId, { event, handler: handler });
106
+ return () => {
107
+ electrobunEventHandlers.delete(listenerId);
108
+ invoke("plugin:electrobun|event_unlisten", { listenerId }).catch(() => {
109
+ // Best-effort cleanup — ignore errors during unlisten.
110
+ });
111
+ };
112
+ },
113
+ async emit(event, payload) {
114
+ await invoke("plugin:electrobun|event_emit", { event, payload });
115
+ },
116
+ };
117
+ }
118
+ /** Internal registry for event handlers keyed by listener ID. */
119
+ const electrobunEventHandlers = new Map();
120
+ /**
121
+ * Dispatch an event from the Electrobun backend to a registered handler.
122
+ * Called by the IPC bridge when the backend pushes an event.
123
+ */
124
+ export function dispatchElectrobunEvent(listenerId, event, payload) {
125
+ const entry = electrobunEventHandlers.get(listenerId);
126
+ if (entry) {
127
+ entry.handler({ event, id: listenerId, payload });
128
+ }
129
+ }
130
+ // ── Filesystem Adapter ──────────────────────────────────────────────────────
131
+ // Supported: writeTextFile, readTextFile, writeFile, readFile, exists,
132
+ // mkdir, readDir, remove, copyFile, rename
133
+ // Partial: none
134
+ // Unsupported: none currently
135
+ //
136
+ // Note: Binary data (Uint8Array/ArrayBuffer) is serialized as a number[]
137
+ // for JSON transport over IPC. The backend is responsible for converting
138
+ // back to native byte buffers.
139
+ export function createElectrobunFsAdapter() {
140
+ return {
141
+ async writeTextFile(path, contents) {
142
+ await invoke("plugin:electrobun|fs_write_text_file", { path, contents });
143
+ },
144
+ async readTextFile(path) {
145
+ return invoke("plugin:electrobun|fs_read_text_file", { path });
146
+ },
147
+ async writeFile(path, contents) {
148
+ // Serialize binary data as number[] for JSON IPC transport.
149
+ let data;
150
+ if (contents instanceof Uint8Array) {
151
+ data = Array.from(contents);
152
+ }
153
+ else if (contents instanceof ArrayBuffer) {
154
+ data = Array.from(new Uint8Array(contents));
155
+ }
156
+ else if (Array.isArray(contents)) {
157
+ data = contents;
158
+ }
159
+ else {
160
+ data = Array.from(new TextEncoder().encode(contents));
161
+ }
162
+ await invoke("plugin:electrobun|fs_write_file", { path, data });
163
+ },
164
+ async readFile(path) {
165
+ const data = await invoke("plugin:electrobun|fs_read_file", { path });
166
+ return new Uint8Array(data);
167
+ },
168
+ async exists(path) {
169
+ return invoke("plugin:electrobun|fs_exists", { path });
170
+ },
171
+ async mkdir(path, options) {
172
+ await invoke("plugin:electrobun|fs_mkdir", {
173
+ path,
174
+ recursive: options?.recursive ?? false,
175
+ });
176
+ },
177
+ async readDir(path, options) {
178
+ return invoke("plugin:electrobun|fs_read_dir", {
179
+ path,
180
+ recursive: options?.recursive ?? false,
181
+ });
182
+ },
183
+ async remove(path, options) {
184
+ await invoke("plugin:electrobun|fs_remove", {
185
+ path,
186
+ recursive: options?.recursive ?? false,
187
+ });
188
+ },
189
+ async copyFile(fromPath, toPath) {
190
+ await invoke("plugin:electrobun|fs_copy_file", { fromPath, toPath });
191
+ },
192
+ async rename(oldPath, newPath) {
193
+ await invoke("plugin:electrobun|fs_rename", { oldPath, newPath });
194
+ },
195
+ };
196
+ }
197
+ // ── Dialog Adapter ──────────────────────────────────────────────────────────
198
+ // Supported: message, ask, open, save
199
+ // Partial: none
200
+ // Unsupported: none currently
201
+ //
202
+ // Note: Dialog appearance and behavior depend on the Electrobun backend's
203
+ // native dialog implementation. Options are forwarded as-is.
204
+ export function createElectrobunDialogAdapter() {
205
+ return {
206
+ async message(text, options) {
207
+ await invoke("plugin:electrobun|dialog_message", {
208
+ text,
209
+ title: options?.title,
210
+ okLabel: options?.okLabel,
211
+ });
212
+ },
213
+ async ask(text, options) {
214
+ return invoke("plugin:electrobun|dialog_ask", {
215
+ text,
216
+ title: options?.title,
217
+ okLabel: options?.okLabel,
218
+ cancelLabel: options?.cancelLabel,
219
+ });
220
+ },
221
+ async open(options) {
222
+ return invoke("plugin:electrobun|dialog_open", {
223
+ title: options?.title,
224
+ multiple: options?.multiple ?? false,
225
+ directory: options?.directory ?? false,
226
+ filters: options?.filters,
227
+ });
228
+ },
229
+ async save(options) {
230
+ return invoke("plugin:electrobun|dialog_save", {
231
+ title: options?.title,
232
+ defaultPath: options?.defaultPath,
233
+ });
234
+ },
235
+ };
236
+ }
237
+ // ── Bootstrap ───────────────────────────────────────────────────────────────
238
+ /**
239
+ * Core provider for the Electrobun runtime.
240
+ *
241
+ * Provides the `invoke` and `convertFileSrc` implementations that all
242
+ * adapters delegate through.
243
+ */
244
+ export function createElectrobunCoreProvider() {
245
+ return {
246
+ id: "electrobun",
247
+ invoke: async (command, _args) => {
248
+ // In a real Electrobun integration, this would delegate to
249
+ // electrobun.ipc.invoke(). For now, we throw to indicate
250
+ // that the actual IPC bridge must be provided at integration time.
251
+ //
252
+ // When integrating, replace this with:
253
+ // return electrobun.ipc.invoke(command, args) as Promise<T>;
254
+ throw new Error(`[webtau/electrobun] No IPC bridge configured. ` +
255
+ `Cannot invoke "${command}". Wire electrobun.ipc.invoke() ` +
256
+ `into the core provider before calling bootstrapElectrobun().`);
257
+ },
258
+ convertFileSrc: (filePath, _protocol) => {
259
+ return `electrobun://asset/${filePath.replace(/^\/+/, "")}`;
260
+ },
261
+ };
262
+ }
263
+ /**
264
+ * Bootstrap all Electrobun adapters at once.
265
+ *
266
+ * Registers the core provider and sets adapters for window, event,
267
+ * filesystem, and dialog modules. After calling this function, all
268
+ * webtau module-level functions will delegate through Electrobun.
269
+ *
270
+ * An optional `coreProvider` can be passed to supply a custom IPC
271
+ * bridge (e.g. one that delegates to `electrobun.ipc.invoke()`).
272
+ *
273
+ * ```ts
274
+ * import { bootstrapElectrobun } from "webtau/adapters/electrobun";
275
+ *
276
+ * bootstrapElectrobun({
277
+ * id: "electrobun",
278
+ * invoke: (cmd, args) => electrobun.ipc.invoke(cmd, args),
279
+ * convertFileSrc: (path) => `electrobun://asset/${path}`,
280
+ * });
281
+ * ```
282
+ */
283
+ export function bootstrapElectrobun(coreProvider) {
284
+ registerProvider(coreProvider ?? createElectrobunCoreProvider());
285
+ setWindowAdapter(createElectrobunWindowAdapter());
286
+ setEventAdapter(createElectrobunEventAdapter());
287
+ setFsAdapter(createElectrobunFsAdapter());
288
+ setDialogAdapter(createElectrobunDialogAdapter());
289
+ }
290
+ //# sourceMappingURL=electrobun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electrobun.js","sourceRoot":"","sources":["../../src/adapters/electrobun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * webtau/adapters/tauri — Tauri runtime adapter.
3
+ *
4
+ * Implements EventAdapter by delegating to @tauri-apps/api/event, giving
5
+ * Tauri the same deterministic listen/unlisten semantics as other runtimes.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * import { bootstrapTauri } from "webtau/adapters/tauri";
10
+ * bootstrapTauri();
11
+ * ```
12
+ */
13
+ import type { CoreProvider, EventAdapter } from "../provider.js";
14
+ export declare function createTauriEventAdapter(): EventAdapter;
15
+ export declare function createTauriCoreProvider(): CoreProvider;
16
+ /**
17
+ * Bootstrap all Tauri adapters at once.
18
+ *
19
+ * Registers the event adapter so that webtau's listen/emit route through
20
+ * Tauri's native IPC event system, ensuring backend-origin events are
21
+ * received by frontend listeners.
22
+ *
23
+ * An optional coreProvider can be passed to override the default Tauri
24
+ * core provider (useful for testing).
25
+ *
26
+ * ```ts
27
+ * import { bootstrapTauri } from "webtau/adapters/tauri";
28
+ * bootstrapTauri();
29
+ * ```
30
+ */
31
+ export declare function bootstrapTauri(coreProvider?: CoreProvider): void;
32
+ //# sourceMappingURL=tauri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauri.d.ts","sourceRoot":"","sources":["../../src/adapters/tauri.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAwBjE,wBAAgB,uBAAuB,IAAI,YAAY,CAmBtD;AAOD,wBAAgB,uBAAuB,IAAI,YAAY,CAYtD;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAGhE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * webtau/adapters/tauri — Tauri runtime adapter.
3
+ *
4
+ * Implements EventAdapter by delegating to @tauri-apps/api/event, giving
5
+ * Tauri the same deterministic listen/unlisten semantics as other runtimes.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * import { bootstrapTauri } from "webtau/adapters/tauri";
10
+ * bootstrapTauri();
11
+ * ```
12
+ */
13
+ import { registerProvider } from "../core.js";
14
+ import { setEventAdapter } from "../event.js";
15
+ // ── Event Adapter ───────────────────────────────────────────────────────────
16
+ // Wraps @tauri-apps/api/event listen/emit for use as webtau EventAdapter.
17
+ // The id field on each dispatched event is the numeric listener id assigned
18
+ // by Tauri's own IPC layer (tauriEvent.id).
19
+ export function createTauriEventAdapter() {
20
+ return {
21
+ async listen(event, handler) {
22
+ // Dynamic import so @tauri-apps/api is only loaded at runtime in Tauri.
23
+ const mod = await import("@tauri-apps/api/event");
24
+ const unlisten = await mod.listen(event, (tauriEvent) => {
25
+ handler({ event: tauriEvent.event, id: tauriEvent.id, payload: tauriEvent.payload });
26
+ });
27
+ return unlisten;
28
+ },
29
+ async emit(event, payload) {
30
+ const mod = await import("@tauri-apps/api/event");
31
+ await mod.emit(event, payload);
32
+ },
33
+ };
34
+ }
35
+ // ── Core Provider ─────────────────────────────────────────────────────────────
36
+ // Wraps @tauri-apps/api/core for explicit provider registration.
37
+ // Prefer auto-detection (isTauri() path in invoke()) over explicit registration
38
+ // unless you need to force Tauri mode or test with a mock provider.
39
+ export function createTauriCoreProvider() {
40
+ return {
41
+ id: "tauri",
42
+ invoke: async (command, args) => {
43
+ const mod = await import("@tauri-apps/api/core");
44
+ return mod.invoke(command, args);
45
+ },
46
+ convertFileSrc: (filePath, protocol) => {
47
+ const proto = protocol ?? "asset";
48
+ return `${proto}://localhost${filePath.startsWith("/") ? filePath : `/${filePath}`}`;
49
+ },
50
+ };
51
+ }
52
+ // ── Bootstrap ─────────────────────────────────────────────────────────────────
53
+ /**
54
+ * Bootstrap all Tauri adapters at once.
55
+ *
56
+ * Registers the event adapter so that webtau's listen/emit route through
57
+ * Tauri's native IPC event system, ensuring backend-origin events are
58
+ * received by frontend listeners.
59
+ *
60
+ * An optional coreProvider can be passed to override the default Tauri
61
+ * core provider (useful for testing).
62
+ *
63
+ * ```ts
64
+ * import { bootstrapTauri } from "webtau/adapters/tauri";
65
+ * bootstrapTauri();
66
+ * ```
67
+ */
68
+ export function bootstrapTauri(coreProvider) {
69
+ registerProvider(coreProvider ?? createTauriCoreProvider());
70
+ setEventAdapter(createTauriEventAdapter());
71
+ }
72
+ //# sourceMappingURL=tauri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauri.js","sourceRoot":"","sources":["../../src/adapters/tauri.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAoB9C,+EAA+E;AAC/E,0EAA0E;AAC1E,4EAA4E;AAC5E,4CAA4C;AAE5C,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,KAAK,CAAC,MAAM,CAAI,KAAa,EAAE,OAAyB;YACtD,wEAAwE;YACxE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,uBAAiC,CAAqB,CAAC;YAChF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAC/B,KAAK,EACL,CAAC,UAAU,EAAE,EAAE;gBACb,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YACvF,CAAC,CACF,CAAC;YACF,OAAO,QAAsB,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,IAAI,CAAI,KAAa,EAAE,OAAW;YACtC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,uBAAiC,CAAqB,CAAC;YAChF,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,iEAAiE;AACjE,gFAAgF;AAChF,oEAAoE;AAEpE,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,EAAE,EAAE,OAAO;QACX,MAAM,EAAE,KAAK,EAAe,OAAe,EAAE,IAA8B,EAAc,EAAE;YACzF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,sBAAgC,CAAoB,CAAC;YAC9E,OAAO,GAAG,CAAC,MAAM,CAAI,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,cAAc,EAAE,CAAC,QAAgB,EAAE,QAAiB,EAAU,EAAE;YAC9D,MAAM,KAAK,GAAG,QAAQ,IAAI,OAAO,CAAC;YAClC,OAAO,GAAG,KAAK,eAAe,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC;QACvF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAC,YAA2B;IACxD,gBAAgB,CAAC,YAAY,IAAI,uBAAuB,EAAE,CAAC,CAAC;IAC5D,eAAe,CAAC,uBAAuB,EAAE,CAAC,CAAC;AAC7C,CAAC"}
package/dist/core.d.ts CHANGED
@@ -11,8 +11,10 @@
11
11
  * (e.g. Electrobun). When no provider is registered and `isTauri()`
12
12
  * is true, Tauri auto-registers itself on first invoke().
13
13
  */
14
- import type { CoreProvider } from "./provider";
14
+ import type { CoreProvider } from "./provider.js";
15
15
  export type { CoreProvider };
16
+ export type { DiagnosticCode, DiagnosticEnvelope } from "./diagnostics.js";
17
+ export { WebtauError } from "./diagnostics.js";
16
18
  type WasmModule = Record<string, (...args: any[]) => any>;
17
19
  export interface WebtauConfig {
18
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,YAAY,EAAE,YAAY,EAAE,CAAC;AAG7B,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAO1D,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAOpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAE7D;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,IAAI,YAAY,GAAG,IAAI,CAEjD;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAKjC;AAyCD;;;;;;;;;;;GAWG;AACH,wBAAsB,MAAM,CAAC,CAAC,GAAG,OAAO,EACtC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC,CAqCZ;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAM1E"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAO1D,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAOpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAE7D;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,IAAI,YAAY,GAAG,IAAI,CAEjD;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAKjC;AAkDD;;;;;;;;;;;GAWG;AACH,wBAAsB,MAAM,CAAC,CAAC,GAAG,OAAO,EACtC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC,CA8EZ;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAM1E"}
package/dist/core.js CHANGED
@@ -11,6 +11,8 @@
11
11
  * (e.g. Electrobun). When no provider is registered and `isTauri()`
12
12
  * is true, Tauri auto-registers itself on first invoke().
13
13
  */
14
+ import { WebtauError } from "./diagnostics.js";
15
+ export { WebtauError } from "./diagnostics.js";
14
16
  let registeredProvider = null;
15
17
  let wasmModule = null;
16
18
  let wasmLoader = null;
@@ -87,8 +89,13 @@ async function getWasmModule() {
87
89
  if (wasmLoadPromise)
88
90
  return wasmLoadPromise;
89
91
  if (!wasmLoader) {
90
- throw new Error("[webtau] No WASM module configured. " +
91
- 'Call configure({ loadWasm: () => import("./wasm") }) before invoke().');
92
+ throw new WebtauError({
93
+ code: "NO_WASM_CONFIGURED",
94
+ runtime: "wasm",
95
+ command: "",
96
+ message: "[webtau] No WASM module configured.",
97
+ hint: 'Call configure({ loadWasm: () => import("./wasm") }) before invoke().',
98
+ });
92
99
  }
93
100
  wasmLoadPromise = wasmLoader().then((mod) => {
94
101
  wasmModule = mod;
@@ -98,7 +105,13 @@ async function getWasmModule() {
98
105
  // user fixes the issue (e.g. reconfigures with a valid loader).
99
106
  wasmLoadPromise = null;
100
107
  onLoadError(err);
101
- throw err;
108
+ throw new WebtauError({
109
+ code: "LOAD_FAILED",
110
+ runtime: "wasm",
111
+ command: "",
112
+ message: `[webtau] Failed to load WASM module: ${err instanceof Error ? err.message : String(err)}`,
113
+ hint: "Check that loadWasm returns a valid WASM module and network is available.",
114
+ });
102
115
  });
103
116
  return wasmLoadPromise;
104
117
  }
@@ -117,7 +130,20 @@ async function getWasmModule() {
117
130
  export async function invoke(command, args) {
118
131
  // 1. Explicit provider — delegate immediately.
119
132
  if (registeredProvider) {
120
- return registeredProvider.invoke(command, args);
133
+ try {
134
+ return await registeredProvider.invoke(command, args);
135
+ }
136
+ catch (err) {
137
+ if (err instanceof WebtauError)
138
+ throw err;
139
+ throw new WebtauError({
140
+ code: "PROVIDER_ERROR",
141
+ runtime: registeredProvider.id,
142
+ command,
143
+ message: err instanceof Error ? err.message : String(err),
144
+ hint: `Provider "${registeredProvider.id}" threw while invoking "${command}". Check the provider implementation.`,
145
+ });
146
+ }
121
147
  }
122
148
  // 2. Auto-detect Tauri — lazily register a Tauri provider, then delegate.
123
149
  if (isTauri()) {
@@ -136,12 +162,47 @@ export async function invoke(command, args) {
136
162
  const wasm = await getWasmModule();
137
163
  const fn = wasm[command];
138
164
  if (typeof fn !== "function") {
139
- throw new Error(`[webtau] WASM module has no export named "${command}". ` +
140
- `Available: ${Object.keys(wasm).filter((k) => typeof wasm[k] === "function").join(", ")}`);
165
+ const available = Object.keys(wasm).filter((k) => typeof wasm[k] === "function").join(", ");
166
+ throw new WebtauError({
167
+ code: "UNKNOWN_COMMAND",
168
+ runtime: "wasm",
169
+ command,
170
+ message: `[webtau] WASM module has no export named "${command}". Available: ${available}`,
171
+ hint: `Export "${command}" is not defined. Available exports: ${available}`,
172
+ });
173
+ }
174
+ try {
175
+ const result = args ? fn(args) : fn();
176
+ // wasm_bindgen can return plain values or promises
177
+ if (result instanceof Promise) {
178
+ try {
179
+ return await result;
180
+ }
181
+ catch (asyncErr) {
182
+ if (asyncErr instanceof WebtauError)
183
+ throw asyncErr;
184
+ throw new WebtauError({
185
+ code: "PROVIDER_ERROR",
186
+ runtime: "wasm",
187
+ command,
188
+ message: asyncErr instanceof Error ? asyncErr.message : String(asyncErr),
189
+ hint: `WASM command "${command}" rejected. Check the Rust implementation for errors.`,
190
+ });
191
+ }
192
+ }
193
+ return result;
194
+ }
195
+ catch (execErr) {
196
+ if (execErr instanceof WebtauError)
197
+ throw execErr;
198
+ throw new WebtauError({
199
+ code: "PROVIDER_ERROR",
200
+ runtime: "wasm",
201
+ command,
202
+ message: execErr instanceof Error ? execErr.message : String(execErr),
203
+ hint: `WASM command "${command}" threw an error. Check the Rust implementation.`,
204
+ });
141
205
  }
142
- const result = args ? fn(args) : fn();
143
- // wasm_bindgen can return plain values or promises
144
- return result instanceof Promise ? result : result;
145
206
  }
146
207
  /**
147
208
  * Converts a file path to a URL that can be used to load assets.
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * webtau/diagnostics — Structured error envelope for all webtau failures.
3
+ *
4
+ * Every failure surface from invoke(), configure(), and provider paths
5
+ * throws a WebtauError instead of a plain Error, enabling callers to
6
+ * programmatically inspect and handle failure categories.
7
+ */
8
+ export type DiagnosticCode = "NO_WASM_CONFIGURED" | "UNKNOWN_COMMAND" | "LOAD_FAILED" | "PROVIDER_ERROR" | "PROVIDER_MISSING";
9
+ export interface DiagnosticEnvelope {
10
+ /** Machine-readable failure category. */
11
+ code: DiagnosticCode;
12
+ /** Which runtime path produced this error: "wasm", "tauri", "provider", or "unknown". */
13
+ runtime: string;
14
+ /** The command name that was invoked when the error occurred, if any. */
15
+ command: string;
16
+ /** Human-readable description of the failure. */
17
+ message: string;
18
+ /** Remediation hint for the developer. */
19
+ hint: string;
20
+ }
21
+ export declare class WebtauError extends Error implements DiagnosticEnvelope {
22
+ readonly code: DiagnosticCode;
23
+ readonly runtime: string;
24
+ readonly command: string;
25
+ readonly hint: string;
26
+ constructor(envelope: DiagnosticEnvelope);
27
+ }
28
+ //# sourceMappingURL=diagnostics.d.ts.map