diff options
Diffstat (limited to 'packages/meshbay-client/src/preload.js')
| -rw-r--r-- | packages/meshbay-client/src/preload.js | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/packages/meshbay-client/src/preload.js b/packages/meshbay-client/src/preload.js index b649ae3..caad523 100644 --- a/packages/meshbay-client/src/preload.js +++ b/packages/meshbay-client/src/preload.js @@ -66,15 +66,26 @@ contextBridge.exposeInMainWorld('meshbay', { backend: () => ipcRenderer.invoke('secrets:backend'), }, - // A save dialog and a write that never passes back through the page. The - // renderer holds an id, not a path. - saveFile: async (suggestedName) => { - const handle = await ipcRenderer.invoke('save:begin', suggestedName); + // Where downloads go, chosen once. The renderer never sees or sends a path — + // it asks for a dialog and is told the folder's name for display only. + folder: { + choose: () => ipcRenderer.invoke('folder:choose'), + get: () => ipcRenderer.invoke('folder:get'), + forget: () => ipcRenderer.invoke('folder:forget'), + }, + + // A sink that writes to disk as chunks arrive, never a buffer handed over at + // the end. `auto` uses the remembered folder without a dialog, which is what + // "save automatically" means; without one, or when the person asked to be + // prompted, a dialog opens. The renderer holds an id, not a path. + saveFile: async (suggestedName, opts) => { + const handle = await ipcRenderer.invoke('save:begin', suggestedName, opts); if (!handle) return null; return { name: handle.name, write: (chunk) => ipcRenderer.invoke('save:write', handle.id, chunk), close: () => ipcRenderer.invoke('save:end', handle.id), + abort: () => ipcRenderer.invoke('save:abort', handle.id), }; }, }); |