Dokumen ini merangkum API utama yang dipasang ke window oleh src/preload.js, berdasarkan src/preload.js, src/userData.js, src/DomUtils.js, src/main.js, dan src/Api.js.
| API | Window | Tujuan |
|---|---|---|
window.fileApi |
Jendela utama | Komunikasi dengan main process: buka/simpan file, jalankan jendela uji, baca/simpan konfigurasi, event menu, dan ganti bahasa. |
window.api |
Jendela halaman uji dan iframe yang dapat diakses | API user script: data pengguna, query dan observasi DOM, overlay, utilitas, header request/response, dan konfigurasi produk. |
Halaman uji juga dapat membungkus window.EventSource, window.fetch, dan mengirim event kustom urlchange.
window.fileApi diekspos melalui contextBridge.exposeInMainWorld('fileApi', ...) dan hanya digunakan di jendela utama.
| Metode | Signature | Deskripsi |
|---|---|---|
launch |
launch(url: string, saForm: object): Promise<{ canceled: false, status: 'success' | 'already_opened' }> |
Membuka atau memakai ulang jendela uji untuk memuat URL. Konfigurasi disimpan; jika jendela sudah ada, jendela dipakai ulang. Implementasi saat ini mengosongkan saForm, jadi biasanya hanya untuk membuka halaman. |
runScript |
runScript(url: string, form: object): Promise<{ canceled: false, status: 'success' | 'already_opened' }> |
Membuka atau memakai ulang jendela uji, memuat URL, dan mengirim form serta skrip. Menerapkan User-Agent dan proxy bila diatur. |
openFile |
Promise<{ canceled: true } | { canceled: false, content: string, filePath: string }> |
Membuka file picker dan membaca file terpilih. |
saveFile |
saveFile(filePath: string | undefined, content: string): Promise<{ canceled: true } | { canceled: false, filePath: string }> |
Menyimpan teks; menampilkan dialog simpan jika filePath kosong. |
getConfig |
Promise<object> |
Membaca ~/.sa.config. Jika filePath ada, isinya disinkronkan ke config.form.script. Mengembalikan {} bila tidak ada atau invalid. |
saveConfig |
saveConfig(config: object): Promise<void> |
Menggabungkan dan menyimpan konfigurasi, mempertahankan config.language dari main process. |
updateLanguage |
updateLanguage(language: string): Promise<void> |
Menyimpan bahasa, memperbarui i18n, membangun ulang menu, dan me-reload jendela utama. Contoh: zh, en, vi, ja, ru, es, fr, in. |
Event menu: onMenuOpenFile(callback), onMenuSaveFile(callback), onMenuChangeLanguage(callback), dan onAbout(callback) mengembalikan Electron.IpcRenderer.
window.api dipasang pada jendela uji dan iframe yang dapat diakses.
interface Window {
api: {
user: UserApi;
config: Record<string, unknown>;
dom: DomApi;
utils: UtilsApi;
header(headerName: string, isRequestHeader: boolean): Promise<string | string[] | undefined>;
};
}api.config membaca konfigurasi produk: api.config === saForm.product || {}.
api.user membaca dan menulis data terkait pengguna. Saat ini data ditopang array memori di main process dan tidak persisten seperti database setelah restart.
Parameter opsional umum: site, account, dan did adalah boolean default false. Main process menerima parameter ini, tetapi belum benar-benar melakukan partisi data.
| Metode | Signature | Deskripsi |
|---|---|---|
put |
put(name: string, value: string, site?: boolean, account?: boolean, did?: boolean): Promise<{ status: boolean }> |
Menyimpan pasangan key-value. |
get |
get(name: string, site?: boolean, account?: boolean, did?: boolean): Promise<{ value: string | null, status: boolean }> |
Membaca nilai. |
remove |
remove(name: string, site?: boolean, account?: boolean, did?: boolean): Promise<{ status: boolean }> |
Menghapus nilai. |
incr |
incr(name: string, step?: number, site?: boolean, account?: boolean, did?: boolean): Promise<{ status: boolean, value: number | string }> |
Menambah step ke Number(value); jika key belum ada, dibuat dengan nilai step. |
decr |
decr(name: string, step?: number, site?: boolean, account?: boolean, did?: boolean): Promise<{ status: boolean, value: number | string }> |
Mengurangi step; jika key belum ada, dibuat dengan step * -1. |
startsWith |
startsWith(prefix: string, site?: boolean, account?: boolean, did?: boolean): Promise<Array<{ name: string, value: string }>> |
Mencari key yang diawali prefix. |
countAll |
countAll(name: string, site?: boolean, account?: boolean): Promise<{ value: number, status: boolean }> |
Menghitung record dengan nama tersebut. |
sumAll |
sumAll(name: string, site?: boolean, account?: boolean): Promise<{ value: number, status: boolean }> |
Menjumlahkan nilai numerik dari record bernama tersebut. |
api.dom menyediakan pencarian DOM, cek visibility, listener koneksi, listener ukuran, dan pembuatan overlay.
Selector yang didukung: CSS (.class-name), XPath (xpath://div[@id="app"]), suffix parent :p/:p2, serta suffix edge :top, :right, :bottom, :left.
| Metode | Signature | Deskripsi |
|---|---|---|
createMutationObserver |
createMutationObserver(ele: Element, bindStr: string, childList: boolean, subtree: boolean, attributes: boolean, characterData: boolean, fn: (mutations: MutationRecord[]) => void): MutationObserver |
Membuat dan menyimpan cache MutationObserver pada ele[bindStr]; callback berjalan dalam requestAnimationFrame. |
querySelector |
querySelector(doc: Document, cssOrXPathSelector: string): HTMLElement | null |
Mengembalikan elemen pertama yang cocok. |
querySelectorAll |
querySelectorAll(doc: Document, cssOrXPathSelector: string): HTMLElement[] |
Mengembalikan semua elemen yang cocok. |
isVisible |
isVisible(ele: HTMLElement): Promise<boolean> |
Memakai IntersectionObserver dan mengembalikan entry.isIntersecting. |
getVisibleRect |
getVisibleRect(ele: HTMLElement): Promise<DOMRectReadOnly> |
Mengembalikan rect terlihat: left, top, right, bottom, width, height, x, y. |
getConnectListeners |
getConnectListeners(): Array<{ querySelector: string; callback: (isConnected: boolean) => void; isConnected?: boolean; }> |
Mengembalikan listener koneksi; dapat gagal jika observer internal belum dibuat. |
addConnectListener |
addConnectListener(cssOrXPathSelector: string, callback: (isConnected: boolean) => void): void |
Memantau elemen muncul atau hilang dari dokumen. Registrasi ulang selector memperbarui callback. |
removeConnectListener |
removeConnectListener(cssOrXPathSelectors: string[]): void |
Menghapus listener untuk selector tersebut. |
addResizeListener |
addResizeListener(cssOrXPathSelector: string, bindWindowStr: string, callback: (rect: DOMRect) => void, createObserver?: boolean, delayTime?: number): ResizeObserver | (() => void) |
Memantau ukuran dan posisi. Jika elemen tidak ada, callback dipanggil dengan new DOMRect(0,0,0,0). Default: true, 500. |
createOverlayBy |
createOverlayBy(cssOrXPathSelector: string, bindWindowStr: string, createObserver?: boolean, delayTime?: number, fn?: (rect: DOMRectReadOnly) => void): HTMLElement |
Membuat div fixed yang mengikuti area terlihat target. Memakai ulang window[bindWindowStr]. |
createOverlayByBorder |
createOverlayByBorder(bindWindowStr: string, top: string | number, right: string | number, bottom: string | number, left: string | number, createObserver?: boolean, delayTime?: number): HTMLElement |
Membuat overlay dari empat batas; tiap batas bisa pixel atau selector. |
Overlay ditambahkan ke document.documentElement, menjadi 0px jika target hilang, dan diperbarui melalui ResizeObserver, resize, dan scroll.
| Metode | Signature | Deskripsi |
|---|---|---|
wait |
wait(fn: () => boolean, timeoutMs: number, intervalMs?: number): Promise<void> |
Polling sampai fn bernilai truthy. intervalMs default 100. Timeout menolak dengan Error("Timeout: function did not return true in time."). |
runScript |
runScript(code: string, userGesture?: boolean, callback?: (result: any, error: Error) => void): Promise<any> |
Menjalankan JavaScript di halaman melalui webFrame.executeJavaScript. |
header(headerName: string, isRequestHeader: boolean): Promise<string | string[] | undefined>Membaca header yang dicatat jendela uji. headerName diubah ke huruf kecil; true membaca request header, false membaca response header. Hanya nama yang dikonfigurasi di requestHeaders atau responseHeaders yang dicatat.
urlchange: jikasaForm.urlchangeEventbenar dan window adalah top-level,pushState,replaceState, danpopstatedibungkus; event berisi{ oldUrl, url }.window.EventSource: dalam mode SSE,addEventListener('message', fn)danonmessagedibungkus; jikamatchUrlcocok, data diproses script dan hasilnya menggantiMessageEvent.data.window.fetch: dalam mode SSE, hanya memproses responsetext/event-streamdengan URL cocok; membaca chunk, menjalankan script, encode ulang, dan menulis keReadableStream.postIpcMessage(type, data): fungsi internal untuk komunikasi page/preload lewatwindow.postMessage, terutama untukdoSSEdandoReplySSE.
saForm.hide: saat inisialisasi dan perubahan DOM, elemen cocok diberi__ignore__="true"dandisplay: none.saForm.remove: saat inisialisasi dan perubahan DOM, elemen cocok dihapus dari parent.
Lihat api.md untuk blok TypeScript lengkap; signature publik sama seperti yang tercantum di atas.