@haex-space/vault-sdk 3.2.7 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{client-exZiz0Ph.d.ts → client-BW3ayV19.d.mts} +83 -2
- package/dist/{client-Bbm83Oy6.d.mts → client-Cm23j1wm.d.ts} +83 -2
- package/dist/index.d.mts +30 -6
- package/dist/index.d.ts +30 -6
- package/dist/index.js +186 -221
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +184 -222
- package/dist/index.mjs.map +1 -1
- package/dist/node.d.mts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/react.d.mts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +185 -224
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +185 -224
- package/dist/react.mjs.map +1 -1
- package/dist/runtime/nuxt.plugin.client.d.mts +2 -2
- package/dist/runtime/nuxt.plugin.client.d.ts +2 -2
- package/dist/runtime/nuxt.plugin.client.js +185 -224
- package/dist/runtime/nuxt.plugin.client.js.map +1 -1
- package/dist/runtime/nuxt.plugin.client.mjs +185 -224
- package/dist/runtime/nuxt.plugin.client.mjs.map +1 -1
- package/dist/svelte.d.mts +2 -2
- package/dist/svelte.d.ts +2 -2
- package/dist/svelte.js +185 -224
- package/dist/svelte.js.map +1 -1
- package/dist/svelte.mjs +185 -224
- package/dist/svelte.mjs.map +1 -1
- package/dist/{types-CDMBvvjl.d.mts → types-fHuxbqa4.d.mts} +13 -1
- package/dist/{types-CDMBvvjl.d.ts → types-fHuxbqa4.d.ts} +13 -1
- package/dist/vue.d.mts +2 -2
- package/dist/vue.d.ts +2 -2
- package/dist/vue.js +185 -224
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +185 -224
- package/dist/vue.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -709,7 +709,15 @@ var HAEXTENSION_EVENTS = {
|
|
|
709
709
|
/** File system change detected (from native file watcher) */
|
|
710
710
|
FILE_CHANGED: "filesync:file-changed",
|
|
711
711
|
/** Tables have been updated via sync (CRDT pull from server) */
|
|
712
|
-
SYNC_TABLES_UPDATED: "haextension:sync:tables-updated"
|
|
712
|
+
SYNC_TABLES_UPDATED: "haextension:sync:tables-updated",
|
|
713
|
+
/** A runtime permission prompt was resolved (granted/denied) by the user.
|
|
714
|
+
* The SDK uses this to auto-retry the original request; extensions may also
|
|
715
|
+
* subscribe via `client.on(HAEXTENSION_EVENTS.PERMISSION_RESOLVED, ...)`. */
|
|
716
|
+
PERMISSION_RESOLVED: "extension:permission-resolved"
|
|
717
|
+
};
|
|
718
|
+
var NOTIFICATION_EVENTS = {
|
|
719
|
+
/** A click on one of this extension's notifications (body or action button). */
|
|
720
|
+
CLICK: "haextension:notification:click"
|
|
713
721
|
};
|
|
714
722
|
var EXTERNAL_EVENTS = {
|
|
715
723
|
/** External request from authorized client */
|
|
@@ -1081,6 +1089,14 @@ var MAIL_COMMANDS = {
|
|
|
1081
1089
|
buildRfc822: "extension_mail_build_rfc822"
|
|
1082
1090
|
};
|
|
1083
1091
|
|
|
1092
|
+
// src/commands/notifications.ts
|
|
1093
|
+
var NOTIFICATION_COMMANDS = {
|
|
1094
|
+
/** Show an OS notification. Returns the assigned notification id. */
|
|
1095
|
+
show: "extension_notifications_show",
|
|
1096
|
+
/** Dismiss a previously shown notification (only own notifications). */
|
|
1097
|
+
dismiss: "extension_notifications_dismiss"
|
|
1098
|
+
};
|
|
1099
|
+
|
|
1084
1100
|
// src/commands/index.ts
|
|
1085
1101
|
var TAURI_COMMANDS = {
|
|
1086
1102
|
database: DATABASE_COMMANDS,
|
|
@@ -1095,7 +1111,8 @@ var TAURI_COMMANDS = {
|
|
|
1095
1111
|
spaces: SPACE_COMMANDS,
|
|
1096
1112
|
shell: SHELL_COMMANDS,
|
|
1097
1113
|
passwords: PASSWORD_COMMANDS,
|
|
1098
|
-
mail: MAIL_COMMANDS
|
|
1114
|
+
mail: MAIL_COMMANDS,
|
|
1115
|
+
notifications: NOTIFICATION_COMMANDS
|
|
1099
1116
|
};
|
|
1100
1117
|
|
|
1101
1118
|
// src/api/storage.ts
|
|
@@ -2181,6 +2198,38 @@ var MailAPI = class {
|
|
|
2181
2198
|
}
|
|
2182
2199
|
};
|
|
2183
2200
|
|
|
2201
|
+
// src/api/notifications.ts
|
|
2202
|
+
var NotificationsAPI = class {
|
|
2203
|
+
constructor(client) {
|
|
2204
|
+
this.client = client;
|
|
2205
|
+
}
|
|
2206
|
+
/** Show a notification. Returns its id so it can be dismissed later. */
|
|
2207
|
+
async show(opts) {
|
|
2208
|
+
return this.client.request(NOTIFICATION_COMMANDS.show, {
|
|
2209
|
+
options: opts
|
|
2210
|
+
});
|
|
2211
|
+
}
|
|
2212
|
+
/** Dismiss a previously shown notification (only own notifications). */
|
|
2213
|
+
async dismiss(id) {
|
|
2214
|
+
return this.client.request(NOTIFICATION_COMMANDS.dismiss, { id });
|
|
2215
|
+
}
|
|
2216
|
+
/**
|
|
2217
|
+
* Listen for clicks on this extension's notifications. Useful when the
|
|
2218
|
+
* extension is already open and wants to react in-app (e.g. router.push the
|
|
2219
|
+
* `path`) instead of relying on the host to focus the webview.
|
|
2220
|
+
*
|
|
2221
|
+
* Returns an unsubscribe function.
|
|
2222
|
+
*/
|
|
2223
|
+
onClick(handler) {
|
|
2224
|
+
const wrapped = (event) => {
|
|
2225
|
+
const data = event.data;
|
|
2226
|
+
if (data) handler(data);
|
|
2227
|
+
};
|
|
2228
|
+
this.client.on(NOTIFICATION_EVENTS.CLICK, wrapped);
|
|
2229
|
+
return () => this.client.off(NOTIFICATION_EVENTS.CLICK, wrapped);
|
|
2230
|
+
}
|
|
2231
|
+
};
|
|
2232
|
+
|
|
2184
2233
|
// src/client/tableName.ts
|
|
2185
2234
|
function validatePublicKey(publicKey) {
|
|
2186
2235
|
if (!publicKey || typeof publicKey !== "string" || publicKey.trim() === "") {
|
|
@@ -2298,6 +2347,21 @@ async function initNativeMode(ctx, log, onEvent, onContextChange) {
|
|
|
2298
2347
|
await setupTauriEventListeners(ctx, log, onEvent, onContextChange);
|
|
2299
2348
|
return { extensionInfo, context };
|
|
2300
2349
|
}
|
|
2350
|
+
async function forwardEvent(listen, log, onEvent, listenOptions, eventName, shape) {
|
|
2351
|
+
try {
|
|
2352
|
+
await listen(eventName, (event) => {
|
|
2353
|
+
if (event.payload == null) {
|
|
2354
|
+
log(`Event '${eventName}' received with no payload`);
|
|
2355
|
+
return;
|
|
2356
|
+
}
|
|
2357
|
+
const extra = shape ? shape(event.payload) : { data: event.payload };
|
|
2358
|
+
onEvent({ type: eventName, timestamp: Date.now(), ...extra });
|
|
2359
|
+
}, listenOptions);
|
|
2360
|
+
log(`Listener registered: ${eventName}`);
|
|
2361
|
+
} catch (error) {
|
|
2362
|
+
log(`Failed to register listener '${eventName}':`, error);
|
|
2363
|
+
}
|
|
2364
|
+
}
|
|
2301
2365
|
async function setupTauriEventListeners(ctx, log, onEvent, onContextChange) {
|
|
2302
2366
|
const { listen } = getTauriEvent();
|
|
2303
2367
|
const webviewLabel = getCurrentWebviewLabel();
|
|
@@ -2329,207 +2393,30 @@ async function setupTauriEventListeners(ctx, log, onEvent, onContextChange) {
|
|
|
2329
2393
|
} catch (error) {
|
|
2330
2394
|
log("Failed to setup context change listener:", error);
|
|
2331
2395
|
}
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
}
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
type: EXTERNAL_EVENTS.ACTION_REQUEST,
|
|
2357
|
-
data: event.payload,
|
|
2358
|
-
timestamp: Date.now()
|
|
2359
|
-
});
|
|
2360
|
-
} else {
|
|
2361
|
-
log("AI action request event has no payload!");
|
|
2362
|
-
}
|
|
2363
|
-
}, listenOptions);
|
|
2364
|
-
log("AI action request listener registered successfully");
|
|
2365
|
-
} catch (error) {
|
|
2366
|
-
log("Failed to setup AI action request listener:", error);
|
|
2367
|
-
}
|
|
2368
|
-
log("Registering file change listener for:", HAEXTENSION_EVENTS.FILE_CHANGED);
|
|
2369
|
-
try {
|
|
2370
|
-
await listen(HAEXTENSION_EVENTS.FILE_CHANGED, (event) => {
|
|
2371
|
-
log("File change event received:", event.payload);
|
|
2372
|
-
if (event.payload) {
|
|
2373
|
-
const payload = event.payload;
|
|
2374
|
-
onEvent({
|
|
2375
|
-
type: HAEXTENSION_EVENTS.FILE_CHANGED,
|
|
2376
|
-
ruleId: payload.ruleId,
|
|
2377
|
-
changeType: payload.changeType,
|
|
2378
|
-
path: payload.path,
|
|
2379
|
-
timestamp: Date.now()
|
|
2380
|
-
});
|
|
2381
|
-
}
|
|
2382
|
-
}, listenOptions);
|
|
2383
|
-
log("File change listener registered successfully");
|
|
2384
|
-
} catch (error) {
|
|
2385
|
-
log("Failed to setup file change listener:", error);
|
|
2386
|
-
}
|
|
2387
|
-
log("Registering sync tables updated listener for:", HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED);
|
|
2388
|
-
try {
|
|
2389
|
-
await listen(HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED, (event) => {
|
|
2390
|
-
log("Sync tables updated event received:", event.payload);
|
|
2391
|
-
if (event.payload) {
|
|
2392
|
-
const payload = event.payload;
|
|
2393
|
-
onEvent({
|
|
2394
|
-
type: HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED,
|
|
2395
|
-
data: { tables: payload.tables },
|
|
2396
|
-
timestamp: Date.now()
|
|
2397
|
-
});
|
|
2398
|
-
}
|
|
2399
|
-
}, listenOptions);
|
|
2400
|
-
log("Sync tables updated listener registered successfully");
|
|
2401
|
-
} catch (error) {
|
|
2402
|
-
log("Failed to setup sync tables updated listener:", error);
|
|
2403
|
-
}
|
|
2404
|
-
log("Setting up LocalSend event listeners");
|
|
2405
|
-
try {
|
|
2406
|
-
await setupLocalSendEventListeners(log, onEvent, listenOptions);
|
|
2407
|
-
log("LocalSend event listeners setup complete");
|
|
2408
|
-
} catch (error) {
|
|
2409
|
-
log("Failed to setup LocalSend event listeners:", error);
|
|
2410
|
-
}
|
|
2411
|
-
log("Setting up Shell event listeners");
|
|
2412
|
-
try {
|
|
2413
|
-
await listen(SHELL_EVENTS.OUTPUT, (event) => {
|
|
2414
|
-
if (event.payload) {
|
|
2415
|
-
const payload = event.payload;
|
|
2416
|
-
onEvent({
|
|
2417
|
-
type: SHELL_EVENTS.OUTPUT,
|
|
2418
|
-
timestamp: Date.now(),
|
|
2419
|
-
sessionId: payload.sessionId,
|
|
2420
|
-
data: payload.data
|
|
2421
|
-
});
|
|
2422
|
-
}
|
|
2423
|
-
}, listenOptions);
|
|
2424
|
-
log("Shell output listener registered");
|
|
2425
|
-
await listen(SHELL_EVENTS.EXIT, (event) => {
|
|
2426
|
-
if (event.payload) {
|
|
2427
|
-
const payload = event.payload;
|
|
2428
|
-
onEvent({
|
|
2429
|
-
type: SHELL_EVENTS.EXIT,
|
|
2430
|
-
timestamp: Date.now(),
|
|
2431
|
-
sessionId: payload.sessionId,
|
|
2432
|
-
exitCode: payload.exitCode
|
|
2433
|
-
});
|
|
2434
|
-
}
|
|
2435
|
-
}, listenOptions);
|
|
2436
|
-
log("Shell exit listener registered");
|
|
2437
|
-
} catch (error) {
|
|
2438
|
-
log("Failed to setup Shell event listeners:", error);
|
|
2439
|
-
}
|
|
2440
|
-
}
|
|
2441
|
-
async function setupLocalSendEventListeners(log, onEvent, listenOptions) {
|
|
2442
|
-
const { listen } = getTauriEvent();
|
|
2443
|
-
try {
|
|
2444
|
-
await listen(LOCALSEND_EVENTS.deviceDiscovered, (event) => {
|
|
2445
|
-
log("LocalSend device discovered:", event.payload);
|
|
2446
|
-
if (event.payload) {
|
|
2447
|
-
onEvent({
|
|
2448
|
-
type: LOCALSEND_EVENTS.deviceDiscovered,
|
|
2449
|
-
data: event.payload,
|
|
2450
|
-
timestamp: Date.now()
|
|
2451
|
-
});
|
|
2452
|
-
}
|
|
2453
|
-
}, listenOptions);
|
|
2454
|
-
log("LocalSend device discovered listener registered");
|
|
2455
|
-
} catch (error) {
|
|
2456
|
-
log("Failed to setup LocalSend device discovered listener:", error);
|
|
2457
|
-
}
|
|
2458
|
-
try {
|
|
2459
|
-
await listen(LOCALSEND_EVENTS.deviceLost, (event) => {
|
|
2460
|
-
log("LocalSend device lost:", event.payload);
|
|
2461
|
-
if (event.payload) {
|
|
2462
|
-
onEvent({
|
|
2463
|
-
type: LOCALSEND_EVENTS.deviceLost,
|
|
2464
|
-
data: event.payload,
|
|
2465
|
-
timestamp: Date.now()
|
|
2466
|
-
});
|
|
2467
|
-
}
|
|
2468
|
-
}, listenOptions);
|
|
2469
|
-
log("LocalSend device lost listener registered");
|
|
2470
|
-
} catch (error) {
|
|
2471
|
-
log("Failed to setup LocalSend device lost listener:", error);
|
|
2472
|
-
}
|
|
2473
|
-
try {
|
|
2474
|
-
await listen(LOCALSEND_EVENTS.transferRequest, (event) => {
|
|
2475
|
-
log("LocalSend transfer request:", event.payload);
|
|
2476
|
-
if (event.payload) {
|
|
2477
|
-
onEvent({
|
|
2478
|
-
type: LOCALSEND_EVENTS.transferRequest,
|
|
2479
|
-
data: event.payload,
|
|
2480
|
-
timestamp: Date.now()
|
|
2481
|
-
});
|
|
2482
|
-
}
|
|
2483
|
-
}, listenOptions);
|
|
2484
|
-
log("LocalSend transfer request listener registered");
|
|
2485
|
-
} catch (error) {
|
|
2486
|
-
log("Failed to setup LocalSend transfer request listener:", error);
|
|
2487
|
-
}
|
|
2488
|
-
try {
|
|
2489
|
-
await listen(LOCALSEND_EVENTS.transferProgress, (event) => {
|
|
2490
|
-
log("LocalSend transfer progress event:", event);
|
|
2491
|
-
if (event.payload) {
|
|
2492
|
-
onEvent({
|
|
2493
|
-
type: LOCALSEND_EVENTS.transferProgress,
|
|
2494
|
-
data: event.payload,
|
|
2495
|
-
timestamp: Date.now()
|
|
2496
|
-
});
|
|
2497
|
-
}
|
|
2498
|
-
}, listenOptions);
|
|
2499
|
-
log("LocalSend transfer progress listener registered");
|
|
2500
|
-
} catch (error) {
|
|
2501
|
-
log("Failed to setup LocalSend transfer progress listener:", error);
|
|
2502
|
-
}
|
|
2503
|
-
try {
|
|
2504
|
-
await listen(LOCALSEND_EVENTS.transferComplete, (event) => {
|
|
2505
|
-
log("LocalSend transfer complete:", event.payload);
|
|
2506
|
-
if (event.payload) {
|
|
2507
|
-
onEvent({
|
|
2508
|
-
type: LOCALSEND_EVENTS.transferComplete,
|
|
2509
|
-
data: event.payload,
|
|
2510
|
-
timestamp: Date.now()
|
|
2511
|
-
});
|
|
2512
|
-
}
|
|
2513
|
-
}, listenOptions);
|
|
2514
|
-
log("LocalSend transfer complete listener registered");
|
|
2515
|
-
} catch (error) {
|
|
2516
|
-
log("Failed to setup LocalSend transfer complete listener:", error);
|
|
2517
|
-
}
|
|
2518
|
-
try {
|
|
2519
|
-
await listen(LOCALSEND_EVENTS.transferFailed, (event) => {
|
|
2520
|
-
log("LocalSend transfer failed:", event.payload);
|
|
2521
|
-
if (event.payload) {
|
|
2522
|
-
onEvent({
|
|
2523
|
-
type: LOCALSEND_EVENTS.transferFailed,
|
|
2524
|
-
data: event.payload,
|
|
2525
|
-
timestamp: Date.now()
|
|
2526
|
-
});
|
|
2527
|
-
}
|
|
2528
|
-
}, listenOptions);
|
|
2529
|
-
log("LocalSend transfer failed listener registered");
|
|
2530
|
-
} catch (error) {
|
|
2531
|
-
log("Failed to setup LocalSend transfer failed listener:", error);
|
|
2532
|
-
}
|
|
2396
|
+
for (const eventName of [
|
|
2397
|
+
HAEXTENSION_EVENTS.PERMISSION_RESOLVED,
|
|
2398
|
+
EXTERNAL_EVENTS.REQUEST,
|
|
2399
|
+
EXTERNAL_EVENTS.ACTION_REQUEST,
|
|
2400
|
+
NOTIFICATION_EVENTS.CLICK,
|
|
2401
|
+
...Object.values(LOCALSEND_EVENTS)
|
|
2402
|
+
]) {
|
|
2403
|
+
await forwardEvent(listen, log, onEvent, listenOptions, eventName);
|
|
2404
|
+
}
|
|
2405
|
+
await forwardEvent(listen, log, onEvent, listenOptions, HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED, (payload) => ({
|
|
2406
|
+
data: { tables: payload.tables }
|
|
2407
|
+
}));
|
|
2408
|
+
await forwardEvent(listen, log, onEvent, listenOptions, HAEXTENSION_EVENTS.FILE_CHANGED, (payload) => {
|
|
2409
|
+
const { ruleId, changeType, path } = payload;
|
|
2410
|
+
return { ruleId, changeType, path };
|
|
2411
|
+
});
|
|
2412
|
+
await forwardEvent(listen, log, onEvent, listenOptions, SHELL_EVENTS.OUTPUT, (payload) => {
|
|
2413
|
+
const { sessionId, data } = payload;
|
|
2414
|
+
return { sessionId, data };
|
|
2415
|
+
});
|
|
2416
|
+
await forwardEvent(listen, log, onEvent, listenOptions, SHELL_EVENTS.EXIT, (payload) => {
|
|
2417
|
+
const { sessionId, exitCode } = payload;
|
|
2418
|
+
return { sessionId, exitCode };
|
|
2419
|
+
});
|
|
2533
2420
|
}
|
|
2534
2421
|
async function initIframeMode(ctx, log, messageHandler) {
|
|
2535
2422
|
if (!isInIframe()) {
|
|
@@ -2873,6 +2760,68 @@ var AI_COMMANDS = {
|
|
|
2873
2760
|
actionRespond: "ai_action_respond"
|
|
2874
2761
|
};
|
|
2875
2762
|
|
|
2763
|
+
// src/client/permissionRetry.ts
|
|
2764
|
+
var PERMISSION_DECISION_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
2765
|
+
var MAX_PERMISSION_RETRIES = 3;
|
|
2766
|
+
function permissionKey(resourceType, action, target) {
|
|
2767
|
+
return `${resourceType}:${action}:${target}`;
|
|
2768
|
+
}
|
|
2769
|
+
var PermissionWaiterRegistry = class {
|
|
2770
|
+
constructor() {
|
|
2771
|
+
this.waiters = /* @__PURE__ */ new Map();
|
|
2772
|
+
}
|
|
2773
|
+
/** Wait for a decision on `key`; resolves "timeout" if none arrives in time. */
|
|
2774
|
+
wait(key, timeoutMs = PERMISSION_DECISION_TIMEOUT_MS) {
|
|
2775
|
+
return new Promise((resolve) => {
|
|
2776
|
+
const set = this.waiters.get(key) ?? /* @__PURE__ */ new Set();
|
|
2777
|
+
this.waiters.set(key, set);
|
|
2778
|
+
const settle = (outcome) => {
|
|
2779
|
+
if (!set.has(callback)) return;
|
|
2780
|
+
set.delete(callback);
|
|
2781
|
+
if (set.size === 0) this.waiters.delete(key);
|
|
2782
|
+
clearTimeout(timer);
|
|
2783
|
+
resolve(outcome);
|
|
2784
|
+
};
|
|
2785
|
+
const callback = (outcome) => settle(outcome);
|
|
2786
|
+
const timer = setTimeout(() => settle("timeout"), timeoutMs);
|
|
2787
|
+
set.add(callback);
|
|
2788
|
+
});
|
|
2789
|
+
}
|
|
2790
|
+
/** Resolve everyone waiting on `key` with the user's decision. */
|
|
2791
|
+
resolve(key, decision) {
|
|
2792
|
+
const set = this.waiters.get(key);
|
|
2793
|
+
if (!set) return;
|
|
2794
|
+
for (const callback of [...set]) callback(decision);
|
|
2795
|
+
}
|
|
2796
|
+
};
|
|
2797
|
+
function toDeniedError(error) {
|
|
2798
|
+
return { ...error, code: 1002 /* DENIED */ };
|
|
2799
|
+
}
|
|
2800
|
+
async function withPermissionRetry(send, registry, log, timeoutMs = PERMISSION_DECISION_TIMEOUT_MS) {
|
|
2801
|
+
for (let attempt = 0; ; attempt++) {
|
|
2802
|
+
try {
|
|
2803
|
+
return await send();
|
|
2804
|
+
} catch (error) {
|
|
2805
|
+
if (!isPermissionPromptError(error) || attempt >= MAX_PERMISSION_RETRIES) {
|
|
2806
|
+
throw error;
|
|
2807
|
+
}
|
|
2808
|
+
const key = permissionKey(error.resourceType, error.action, error.target);
|
|
2809
|
+
log(`Permission prompt required for ${key} \u2014 waiting for user decision`);
|
|
2810
|
+
const outcome = await registry.wait(key, timeoutMs);
|
|
2811
|
+
if (outcome === "granted") {
|
|
2812
|
+
log(`Permission ${key} granted \u2014 retrying request`);
|
|
2813
|
+
continue;
|
|
2814
|
+
}
|
|
2815
|
+
if (outcome === "denied") {
|
|
2816
|
+
log(`Permission ${key} denied`);
|
|
2817
|
+
throw toDeniedError(error);
|
|
2818
|
+
}
|
|
2819
|
+
log(`Permission ${key} prompt timed out`);
|
|
2820
|
+
throw error;
|
|
2821
|
+
}
|
|
2822
|
+
}
|
|
2823
|
+
}
|
|
2824
|
+
|
|
2876
2825
|
// src/client.ts
|
|
2877
2826
|
var HaexVaultSdk = class {
|
|
2878
2827
|
constructor(config = {}) {
|
|
@@ -2888,6 +2837,7 @@ var HaexVaultSdk = class {
|
|
|
2888
2837
|
this.eventListeners = /* @__PURE__ */ new Map();
|
|
2889
2838
|
this.externalRequestHandlers = /* @__PURE__ */ new Map();
|
|
2890
2839
|
this.reactiveSubscribers = /* @__PURE__ */ new Set();
|
|
2840
|
+
this.permissionWaiters = new PermissionWaiterRegistry();
|
|
2891
2841
|
// Handlers
|
|
2892
2842
|
this.messageHandler = null;
|
|
2893
2843
|
/**
|
|
@@ -2923,7 +2873,16 @@ var HaexVaultSdk = class {
|
|
|
2923
2873
|
this.shell = new ShellAPI(this);
|
|
2924
2874
|
this.passwords = new PasswordsAPI(this);
|
|
2925
2875
|
this.mail = new MailAPI(this);
|
|
2876
|
+
this.notifications = new NotificationsAPI(this);
|
|
2926
2877
|
installConsoleForwarding(this.config.debug);
|
|
2878
|
+
this.on(HAEXTENSION_EVENTS.PERMISSION_RESOLVED, (event) => {
|
|
2879
|
+
const data = event.data;
|
|
2880
|
+
if (!data) return;
|
|
2881
|
+
this.permissionWaiters.resolve(
|
|
2882
|
+
permissionKey(data.resourceType, data.action, data.target),
|
|
2883
|
+
data.decision === "denied" ? "denied" : "granted"
|
|
2884
|
+
);
|
|
2885
|
+
});
|
|
2927
2886
|
this.readyPromise = new Promise((resolve, reject) => {
|
|
2928
2887
|
this.resolveReady = resolve;
|
|
2929
2888
|
this.rejectReady = reject;
|
|
@@ -3072,24 +3031,27 @@ var HaexVaultSdk = class {
|
|
|
3072
3031
|
// ==========================================================================
|
|
3073
3032
|
async request(method, params) {
|
|
3074
3033
|
const resolvedParams = params ?? {};
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3087
|
-
|
|
3088
|
-
|
|
3089
|
-
|
|
3090
|
-
|
|
3091
|
-
|
|
3092
|
-
|
|
3034
|
+
const send = () => {
|
|
3035
|
+
if (this.isNativeWindow && hasTauri()) {
|
|
3036
|
+
const paramsWithCredentials = {
|
|
3037
|
+
...resolvedParams,
|
|
3038
|
+
publicKey: this._extensionInfo?.publicKey,
|
|
3039
|
+
name: this._extensionInfo?.name
|
|
3040
|
+
};
|
|
3041
|
+
return sendInvoke(method, paramsWithCredentials, this.config, this.log.bind(this));
|
|
3042
|
+
}
|
|
3043
|
+
const requestId = generateRequestId(++this.requestCounter);
|
|
3044
|
+
return sendPostMessage(
|
|
3045
|
+
method,
|
|
3046
|
+
resolvedParams,
|
|
3047
|
+
requestId,
|
|
3048
|
+
this.config,
|
|
3049
|
+
this._extensionInfo,
|
|
3050
|
+
this.pendingRequests,
|
|
3051
|
+
this.hostPort
|
|
3052
|
+
);
|
|
3053
|
+
};
|
|
3054
|
+
return withPermissionRetry(send, this.permissionWaiters, this.log.bind(this));
|
|
3093
3055
|
}
|
|
3094
3056
|
// ==========================================================================
|
|
3095
3057
|
// Private: Initialization
|
|
@@ -3850,6 +3812,6 @@ function createHaexVaultSdk(config = {}) {
|
|
|
3850
3812
|
return new HaexVaultSdk(config);
|
|
3851
3813
|
}
|
|
3852
3814
|
|
|
3853
|
-
export { COSE_ALGORITHM, DEFAULT_TIMEOUT, DatabaseAPI, EXTERNAL_EVENTS, ErrorCode, ExternalConnectionErrorCode, ExternalConnectionState, FilesystemAPI, HAEXSPACE_MESSAGE_TYPES, HAEXTENSION_EVENTS, HaexVaultSdk, HaexVaultSdkError, KEY_AGREEMENT_ALGO, KnownPath, LOCALSEND_EVENTS, LocalSendAPI, MAIL_COMMANDS, MailAPI, PASSWORD_COMMANDS, PasswordsAPI, PermissionErrorCode, PermissionStatus, PermissionsAPI, RemoteStorageAPI, SHELL_EVENTS, SIGNING_ALGO, SPACE_COMMANDS, ShellAPI, SpacesAPI, TABLE_SEPARATOR, TAURI_COMMANDS, WebAPI, arrayBufferToBase64, base58btcDecode, base58btcEncode, base64ToArrayBuffer, canExternalClientSendRequests, createHaexVaultSdk, decryptCrdtData, decryptPrivateKeyAsync, decryptSpaceNameAsync, decryptString, decryptVaultKey, decryptVaultName, decryptWithPrivateKeyAsync, deriveKeyFromPassword, didKeyToPublicKeyAsync, encryptCrdtData, encryptPrivateKeyAsync, encryptSpaceNameAsync, encryptString, encryptVaultKey, encryptWithPublicKeyAsync, exportKeyPairAsync, exportPrivateKeyAsync, exportPublicKeyAsync, exportPublicKeyCoseAsync, exportUserKeypairAsync, generateCredentialId, generateIdentityAsync, generatePasskeyPairAsync, generateSpaceKey, generateUserKeypairAsync, generateVaultKey, getTableName, hexToBytes, importPrivateKeyAsync, importPrivateKeyForKeyAgreementAsync, importPublicKeyAsync, importPublicKeyForKeyAgreementAsync, importUserPrivateKeyAsync, importUserPublicKeyAsync, installBaseTag, installCookiePolyfill, installHistoryPolyfill, installLocalStoragePolyfill, installPolyfills, installSessionStoragePolyfill, isExternalClientConnected, isPermissionDeniedError, isPermissionError, isPermissionPromptError, publicKeyToDidKeyAsync, signClaimPresentationAsync, signRecordAsync, signSpaceChallengeAsync, signWithPasskeyAsync, sortObjectKeysRecursively, unwrapKey, verifyClaimPresentationAsync, verifyExtensionSignature, verifyRecordSignatureAsync, verifySpaceChallengeAsync, verifyWithPasskeyAsync, wrapKey };
|
|
3815
|
+
export { COSE_ALGORITHM, DEFAULT_TIMEOUT, DatabaseAPI, EXTERNAL_EVENTS, ErrorCode, ExternalConnectionErrorCode, ExternalConnectionState, FilesystemAPI, HAEXSPACE_MESSAGE_TYPES, HAEXTENSION_EVENTS, HaexVaultSdk, HaexVaultSdkError, KEY_AGREEMENT_ALGO, KnownPath, LOCALSEND_EVENTS, LocalSendAPI, MAIL_COMMANDS, MailAPI, NOTIFICATION_COMMANDS, NOTIFICATION_EVENTS, NotificationsAPI, PASSWORD_COMMANDS, PasswordsAPI, PermissionErrorCode, PermissionStatus, PermissionsAPI, RemoteStorageAPI, SHELL_EVENTS, SIGNING_ALGO, SPACE_COMMANDS, ShellAPI, SpacesAPI, TABLE_SEPARATOR, TAURI_COMMANDS, WebAPI, arrayBufferToBase64, base58btcDecode, base58btcEncode, base64ToArrayBuffer, canExternalClientSendRequests, createHaexVaultSdk, decryptCrdtData, decryptPrivateKeyAsync, decryptSpaceNameAsync, decryptString, decryptVaultKey, decryptVaultName, decryptWithPrivateKeyAsync, deriveKeyFromPassword, didKeyToPublicKeyAsync, encryptCrdtData, encryptPrivateKeyAsync, encryptSpaceNameAsync, encryptString, encryptVaultKey, encryptWithPublicKeyAsync, exportKeyPairAsync, exportPrivateKeyAsync, exportPublicKeyAsync, exportPublicKeyCoseAsync, exportUserKeypairAsync, generateCredentialId, generateIdentityAsync, generatePasskeyPairAsync, generateSpaceKey, generateUserKeypairAsync, generateVaultKey, getTableName, hexToBytes, importPrivateKeyAsync, importPrivateKeyForKeyAgreementAsync, importPublicKeyAsync, importPublicKeyForKeyAgreementAsync, importUserPrivateKeyAsync, importUserPublicKeyAsync, installBaseTag, installCookiePolyfill, installHistoryPolyfill, installLocalStoragePolyfill, installPolyfills, installSessionStoragePolyfill, isExternalClientConnected, isPermissionDeniedError, isPermissionError, isPermissionPromptError, publicKeyToDidKeyAsync, signClaimPresentationAsync, signRecordAsync, signSpaceChallengeAsync, signWithPasskeyAsync, sortObjectKeysRecursively, unwrapKey, verifyClaimPresentationAsync, verifyExtensionSignature, verifyRecordSignatureAsync, verifySpaceChallengeAsync, verifyWithPasskeyAsync, wrapKey };
|
|
3854
3816
|
//# sourceMappingURL=index.mjs.map
|
|
3855
3817
|
//# sourceMappingURL=index.mjs.map
|