Este documento resume las API principales montadas en window por src/preload.js, según src/preload.js, src/userData.js, src/DomUtils.js, src/main.js y src/Api.js.
| API | Ventana | Propósito |
|---|---|---|
window.fileApi |
Ventana principal | Comunicación con el proceso principal: abrir/guardar archivos, lanzar la ventana de prueba, leer/guardar configuración, eventos de menú y cambio de idioma. |
window.api |
Ventana de prueba e iframes accesibles | API para scripts de usuario: datos de usuario, solicitudes HTTP, consultas y observación DOM, overlays, utilidades, encabezados request/response y configuración de producto. |
La página de prueba también puede envolver window.EventSource, window.fetch y emitir el evento personalizado urlchange.
window.fileApi se expone mediante contextBridge.exposeInMainWorld('fileApi', ...) y solo se usa en la ventana principal.
| Método | Firma | Descripción |
|---|---|---|
launch |
launch(url: string, saForm: object): Promise<{ canceled: false, status: 'success' | 'already_opened' }> |
Abre o reutiliza la ventana de prueba para cargar la URL. Guarda la configuración y reutiliza la ventana si ya existe. La implementación actual limpia saForm, por lo que normalmente solo abre la página. |
runScript |
runScript(url: string, form: object): Promise<{ canceled: false, status: 'success' | 'already_opened' }> |
Abre o reutiliza la ventana de prueba, carga la URL y pasa el formulario y el script. Aplica User-Agent y proxy si están configurados. |
openFile |
Promise<{ canceled: true } | { canceled: false, content: string, filePath: string }> |
Abre el selector de archivos y lee el contenido elegido. |
saveFile |
saveFile(filePath: string | undefined, content: string): Promise<{ canceled: true } | { canceled: false, filePath: string }> |
Guarda texto; muestra diálogo si filePath está vacío. |
getConfig |
Promise<object> |
Lee ~/.sa.config. Si existe filePath, sincroniza su contenido con config.form.script. Devuelve {} si falta o es inválida. |
saveConfig |
saveConfig(config: object): Promise<void> |
Fusiona y guarda configuración, conservando config.language del proceso principal. |
updateLanguage |
updateLanguage(language: string): Promise<void> |
Guarda idioma, actualiza i18n, reconstruye menús y recarga la ventana principal. Ejemplos: zh, en, vi, ja, ru, es, fr, in. |
Eventos de menú: onMenuOpenFile(callback), onMenuSaveFile(callback), onMenuChangeLanguage(callback) y onAbout(callback) devuelven Electron.IpcRenderer.
window.api se monta en la ventana de prueba y en iframes accesibles.
interface Window {
api: {
user: UserApi;
http: HttpApi;
config: Record<string, unknown>;
dom: DomApi;
utils: UtilsApi;
header(headerName: string, isRequestHeader: boolean): Promise<string | string[] | undefined>;
};
}api.config lee la configuración de producto: api.config === saForm.product || {}.
api.http ofrece herramientas de solicitud HTTP para scripts de usuario. api.http.ajax ejecuta la solicitud real en el proceso principal del navegador, por lo que no queda limitada por la política CORS de la página.
| Método | Firma | Descripción |
|---|---|---|
ajax |
ajax(options: { url: string; method?: string; data?: any; headers?: Record<string, string>; timeout?: number; dataType?: 'json' | 'text' | 'html' | 'arrayBuffer'; contentType?: string; processData?: boolean }): Promise<{ ok: boolean, status: number, statusText: string, data?: any, error?: string, timeout?: boolean }> |
Envía una solicitud HTTP. method usa GET por defecto; dataType usa json; contentType usa application/x-www-form-urlencoded; charset=UTF-8; processData usa true. Los datos de GET/HEAD se serializan en la query string y los demás se escriben en el body. |
El resultado contiene ok, status y statusText. data contiene la respuesta parseada cuando es posible, error contiene el mensaje de error y timeout vale true si el tiempo de espera abortó la solicitud.
api.user lee y escribe datos asociados al usuario. Actualmente se respalda con un arreglo en memoria del proceso principal y no se conserva como base de datos tras reiniciar.
Parámetros opcionales comunes: site, account y did son booleanos con valor por defecto false. El proceso principal los acepta, pero aún no particiona datos realmente.
| Método | Firma | Descripción |
|---|---|---|
put |
put(name: string, value: string, site?: boolean, account?: boolean, did?: boolean): Promise<{ status: boolean }> |
Guarda una clave y valor. |
get |
get(name: string, site?: boolean, account?: boolean, did?: boolean): Promise<{ value: string | null, status: boolean }> |
Lee un valor. |
remove |
remove(name: string, site?: boolean, account?: boolean, did?: boolean): Promise<{ status: boolean }> |
Elimina un valor. |
incr |
incr(name: string, step?: number, site?: boolean, account?: boolean, did?: boolean): Promise<{ status: boolean, value: number | string }> |
Suma step a Number(value); si no existe, crea la clave con step. |
decr |
decr(name: string, step?: number, site?: boolean, account?: boolean, did?: boolean): Promise<{ status: boolean, value: number | string }> |
Resta step; si no existe, crea la clave con step * -1. |
startsWith |
startsWith(prefix: string, site?: boolean, account?: boolean, did?: boolean): Promise<Array<{ name: string, value: string }>> |
Busca claves que empiezan con prefix. |
countAll |
countAll(name: string, site?: boolean, account?: boolean): Promise<{ value: number, status: boolean }> |
Cuenta registros con ese nombre. |
sumAll |
sumAll(name: string, site?: boolean, account?: boolean): Promise<{ value: number, status: boolean }> |
Suma valores numéricos con ese nombre. |
api.dom ofrece búsqueda DOM, visibilidad, listeners de conexión, listeners de tamaño y creación de overlays.
Selectores soportados: CSS (.class-name), XPath (xpath://div[@id="app"]), sufijos de padre :p/:p2 y sufijos de borde :top, :right, :bottom, :left.
| Método | Firma | Descripción |
|---|---|---|
createMutationObserver |
createMutationObserver(ele: Element, bindStr: string, childList: boolean, subtree: boolean, attributes: boolean, characterData: boolean, fn: (mutations: MutationRecord[]) => void): MutationObserver |
Crea y cachea un MutationObserver en ele[bindStr]; el callback corre dentro de requestAnimationFrame. |
querySelector |
querySelector(doc: Document, cssOrXPathSelector: string): HTMLElement | null |
Devuelve el primer elemento coincidente. |
querySelectorAll |
querySelectorAll(doc: Document, cssOrXPathSelector: string): HTMLElement[] |
Devuelve todos los elementos coincidentes. |
isVisible |
isVisible(ele: HTMLElement): Promise<boolean> |
Usa IntersectionObserver y devuelve entry.isIntersecting. |
getVisibleRect |
getVisibleRect(ele: HTMLElement): Promise<DOMRectReadOnly> |
Devuelve el rectángulo visible con left, top, right, bottom, width, height, x, y. |
getConnectListeners |
getConnectListeners(): Array<{ querySelector: string; callback: (isConnected: boolean) => void; isConnected?: boolean; }> |
Devuelve listeners de conexión; puede fallar si el observador interno aún no existe. |
addConnectListener |
addConnectListener(cssOrXPathSelector: string, callback: (isConnected: boolean) => void): void |
Vigila si un elemento aparece o desaparece del documento. Repetir selector actualiza el callback. |
removeConnectListener |
removeConnectListener(cssOrXPathSelectors: string[]): void |
Elimina listeners de esos selectores. |
addResizeListener |
addResizeListener(cssOrXPathSelector: string, bindWindowStr: string, callback: (rect: DOMRect) => void, createObserver?: boolean, delayTime?: number): ResizeObserver | (() => void) |
Vigila tamaño y posición. Si no existe el elemento, llama con new DOMRect(0,0,0,0). Por defecto: true, 500. |
createOverlayBy |
createOverlayBy(cssOrXPathSelector: string, bindWindowStr: string, createObserver?: boolean, delayTime?: number, fn?: (rect: DOMRectReadOnly) => void): HTMLElement |
Crea un div fijo que sigue el área visible del objetivo. Reutiliza window[bindWindowStr]. |
createOverlayByBorder |
createOverlayByBorder(bindWindowStr: string, top: string | number, right: string | number, bottom: string | number, left: string | number, createObserver?: boolean, delayTime?: number): HTMLElement |
Crea un overlay desde cuatro bordes, cada uno en píxeles o selector. |
Los overlays se agregan a document.documentElement, pasan a 0px si el objetivo desaparece y se actualizan con ResizeObserver, resize y scroll.
| Método | Firma | Descripción |
|---|---|---|
wait |
wait(fn: () => boolean, timeoutMs: number, intervalMs?: number): Promise<void> |
Sondea hasta que fn sea verdadera. intervalMs vale 100. Si vence, rechaza Error("Timeout: function did not return true in time."). |
runScript |
runScript(code: string, userGesture?: boolean, callback?: (result: any, error: Error) => void): Promise<any> |
Ejecuta JavaScript en la página con webFrame.executeJavaScript. |
header(headerName: string, isRequestHeader: boolean): Promise<string | string[] | undefined>Lee encabezados registrados por la ventana de prueba. headerName se pasa a minúsculas; true lee request headers y false response headers. Solo se registran nombres configurados en requestHeaders o responseHeaders.
urlchange: sisaForm.urlchangeEventes verdadero y la ventana es top-level, se envuelvenpushState,replaceStateypopstate; el evento entrega{ oldUrl, url }.window.EventSource: en modo SSE se envuelvenaddEventListener('message', fn)yonmessage; simatchUrlcoincide, el script procesa los datos y su retorno reemplazaMessageEvent.data.window.fetch: en modo SSE solo procesa respuestastext/event-streamcuya URL coincida; lee chunks, ejecuta el script, re-encodea y escribe en unReadableStream.postIpcMessage(type, data): función interna para comunicación page/preload porwindow.postMessage, usada principalmente pordoSSEydoReplySSE.
saForm.hide: durante inicialización y cambios DOM, los elementos coincidentes reciben__ignore__="true"ydisplay: none.saForm.remove: durante inicialización y cambios DOM, los elementos coincidentes se eliminan de su padre.
Consulte api.md para el bloque TypeScript completo; las firmas públicas son las mismas que las listadas arriba.