// src/preload/index.ts import { contextBridge, ipcRenderer } from 'electron' const electronAPI = { window: { minimize: () => ipcRenderer.send('window:minimize'), maximize: () => ipcRenderer.send('window:maximize'), close: () => ipcRenderer.send('window:close'), }, theme: { get: (): Promise => ipcRenderer.invoke('theme:get'), set: (theme: 'system' | 'dark' | 'light') => ipcRenderer.send('theme:set', theme), onOsUpdated: (callback: (isDark: boolean) => void) => { ipcRenderer.on('theme:os-updated', (_e, isDark: boolean) => callback(isDark)) }, }, dialog: { openFile: (options: { title?: string; filters?: { name: string; extensions: string[] }[] }) => ipcRenderer.invoke('dialog:openFile', options), }, credential: { encrypt: (text: string): Promise => ipcRenderer.invoke('credential:encrypt', text), decrypt: (encoded: string): Promise => ipcRenderer.invoke('credential:decrypt', encoded), }, storage: { getConnections: (): Promise => ipcRenderer.invoke('storage:getConnections'), saveConnection: (conn: any): Promise => ipcRenderer.invoke('storage:saveConnection', conn), deleteConnection: (id: string): Promise => ipcRenderer.invoke('storage:deleteConnection', id), reorderConnections: (ids: string[]): Promise => ipcRenderer.invoke('storage:reorderConnections', ids), getSettings: (): Promise => ipcRenderer.invoke('storage:getSettings'), saveSettings: (settings: any): Promise => ipcRenderer.invoke('storage:saveSettings', settings), }, redis: { connect: (id: string, opts: any): Promise => ipcRenderer.invoke('redis:connect', id, opts), disconnect: (id: string): Promise => ipcRenderer.invoke('redis:disconnect', id), execute: (id: string, command: string, args: string[]): Promise => ipcRenderer.invoke('redis:execute', id, command, args), getInfo: (id: string): Promise => ipcRenderer.invoke('redis:getInfo', id), scanKeys: (id: string, cursor: string, pattern: string, count: number): Promise => ipcRenderer.invoke('redis:scanKeys', id, cursor, pattern, count), getKeyType: (id: string, key: string): Promise => ipcRenderer.invoke('redis:getKeyType', id, key), getKeyTTL: (id: string, key: string): Promise => ipcRenderer.invoke('redis:getKeyTTL', id, key), getString: (id: string, key: string): Promise => ipcRenderer.invoke('redis:getString', id, key), setString: (id: string, key: string, value: string): Promise => ipcRenderer.invoke('redis:setString', id, key, value), // ReJson rejsonGet: (id: string, key: string, path: string): Promise => ipcRenderer.invoke('redis:rejsonGet', id, key, path), rejsonSet: (id: string, key: string, path: string, value: string): Promise => ipcRenderer.invoke('redis:rejsonSet', id, key, path, value), deleteKey: (id: string, key: string): Promise => ipcRenderer.invoke('redis:deleteKey', id, key), hashScan: (id: string, key: string, cursor: string, count: number): Promise => ipcRenderer.invoke('redis:hashScan', id, key, cursor, count), hashSet: (id: string, key: string, field: string, value: string): Promise => ipcRenderer.invoke('redis:hashSet', id, key, field, value), hashDel: (id: string, key: string, field: string): Promise => ipcRenderer.invoke('redis:hashDel', id, key, field), setTTL: (id: string, key: string, ttl: number): Promise => ipcRenderer.invoke('redis:setTTL', id, key, ttl), selectDb: (id: string, db: number): Promise => ipcRenderer.invoke('redis:selectDb', id, db), dbSize: (id: string): Promise => ipcRenderer.invoke('redis:dbSize', id), // List listRange: (id: string, key: string, start: number, stop: number): Promise => ipcRenderer.invoke('redis:listRange', id, key, start, stop), listLength: (id: string, key: string): Promise => ipcRenderer.invoke('redis:listLength', id, key), listPush: (id: string, key: string, values: string[]): Promise => ipcRenderer.invoke('redis:listPush', id, key, values), listSet: (id: string, key: string, index: number, value: string): Promise => ipcRenderer.invoke('redis:listSet', id, key, index, value), listRemove: (id: string, key: string, count: number, value: string): Promise => ipcRenderer.invoke('redis:listRemove', id, key, count, value), // Set setMembers: (id: string, key: string): Promise => ipcRenderer.invoke('redis:setMembers', id, key), setSize: (id: string, key: string): Promise => ipcRenderer.invoke('redis:setSize', id, key), setAdd: (id: string, key: string, members: string[]): Promise => ipcRenderer.invoke('redis:setAdd', id, key, members), setRemove: (id: string, key: string, members: string[]): Promise => ipcRenderer.invoke('redis:setRemove', id, key, members), // Sorted set zsetRange: (id: string, key: string, start: number, stop: number, withScores: boolean): Promise => ipcRenderer.invoke('redis:zsetRange', id, key, start, stop, withScores), zsetSize: (id: string, key: string): Promise => ipcRenderer.invoke('redis:zsetSize', id, key), zsetAdd: (id: string, key: string, score: number, member: string): Promise => ipcRenderer.invoke('redis:zsetAdd', id, key, score, member), zsetRemove: (id: string, key: string, members: string[]): Promise => ipcRenderer.invoke('redis:zsetRemove', id, key, members), // Slow log slowLogGet: (id: string, count: number): Promise => ipcRenderer.invoke('redis:slowLogGet', id, count), slowLogLen: (id: string): Promise => ipcRenderer.invoke('redis:slowLogLen', id), // Memory memoryUsage: (id: string, key: string): Promise => ipcRenderer.invoke('redis:memoryUsage', id, key), batchDelete: (id: string, keys: string[]): Promise => ipcRenderer.invoke('redis:batchDelete', id, keys), // Stream streamInfo: (id: string, key: string): Promise => ipcRenderer.invoke('redis:streamInfo', id, key), streamRange: (id: string, key: string, start: string, end: string, count: number): Promise => ipcRenderer.invoke('redis:streamRange', id, key, start, end, count), streamAdd: (id: string, key: string, streamId: string, fieldValues: string[]): Promise => ipcRenderer.invoke('redis:streamAdd', id, key, streamId, fieldValues), streamTrim: (id: string, key: string, maxLen: number): Promise => ipcRenderer.invoke('redis:streamTrim', id, key, maxLen), streamDel: (id: string, key: string, ids: string[]): Promise => ipcRenderer.invoke('redis:streamDel', id, key, ids), // Stream consumer groups streamGroups: (id: string, key: string): Promise => ipcRenderer.invoke('redis:streamGroups', id, key), streamConsumers: (id: string, key: string, group: string): Promise => ipcRenderer.invoke('redis:streamConsumers', id, key, group), streamGroupCreate: (id: string, key: string, group: string, startId: string, mkstream: boolean): Promise => ipcRenderer.invoke('redis:streamGroupCreate', id, key, group, startId, mkstream), streamGroupDestroy: (id: string, key: string, group: string): Promise => ipcRenderer.invoke('redis:streamGroupDestroy', id, key, group), streamAck: (id: string, key: string, group: string, ids: string[]): Promise => ipcRenderer.invoke('redis:streamAck', id, key, group, ids), // Key ops renameKey: (id: string, oldKey: string, newKey: string): Promise => ipcRenderer.invoke('redis:renameKey', id, oldKey, newKey), existsKey: (id: string, key: string): Promise => ipcRenderer.invoke('redis:existsKey', id, key), ping: (id: string): Promise => ipcRenderer.invoke('redis:ping', id), isConnected: (id: string): Promise => ipcRenderer.invoke('redis:isConnected', id), // Command log getCommandLog: (): Promise => ipcRenderer.invoke('redis:getCommandLog'), clearCommandLog: (): Promise => ipcRenderer.invoke('redis:clearCommandLog'), // Format decodeValue: (value: string, format: string): Promise => ipcRenderer.invoke('redis:decodeValue', value, format), detectFormat: (value: string): Promise => ipcRenderer.invoke('redis:detectFormat', value), customFormat: (value: string, command: string, key: string): Promise => ipcRenderer.invoke('redis:customFormat', value, command, key), // Pub/Sub subscribe: (id: string, channels: string[], isPattern: boolean): Promise => ipcRenderer.invoke('redis:subscribe', id, channels, isPattern), unsubscribe: (id: string): Promise => ipcRenderer.invoke('redis:unsubscribe', id), onSubscribeMessage: (callback: (msg: any) => void) => { ipcRenderer.on('redis:subscribeMessage', (_e, msg) => callback(msg)) }, // Monitor monitor: (id: string): Promise => ipcRenderer.invoke('redis:monitor', id), monitorStop: (id: string): Promise => ipcRenderer.invoke('redis:monitorStop', id), onMonitorMessage: (callback: (msg: any) => void) => { ipcRenderer.on('redis:monitorMessage', (_e, msg) => callback(msg)) }, }, updater: { check: (): Promise => ipcRenderer.invoke('updater:check'), download: (): Promise => ipcRenderer.invoke('updater:download'), install: () => ipcRenderer.invoke('updater:install'), onStatus: (callback: (status: any) => void) => { ipcRenderer.on('updater:status', (_e, status) => callback(status)) }, }, } contextBridge.exposeInMainWorld('electronAPI', electronAPI)