Skip to content

Lampiran API Skrip ​

Tujuan ​

Menjelaskan kemampuan window.api yang tersedia untuk skrip halaman situs dan skrip intersepsi API, termasuk pembacaan konfigurasi, request HTTP, data pengguna, alat DOM, utilitas umum, serta pembacaan header request/response.

Skrip halaman dan skrip intersepsi API normal dapat menggunakan window.api. Skrip SSE hanya menjamin data diteruskan dan biasanya tidak bergantung pada window.api.

ts
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 ​

Membaca konfigurasi kustom dari lingkungan skrip situs.

ts
config: Record<string, unknown>

Contoh:

js
const apiBase = api.config.apiBase;

api.http ​

api.http menyediakan helper HTTP untuk skrip pengguna. api.http.ajax menjalankan request sebenarnya di proses utama browser, sehingga tidak dibatasi oleh kebijakan CORS halaman.

api.http.ajax(options) ​

Mengirim request HTTP.

ts
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;
}>
OpsiTipeDefaultDeskripsi
urlstring-URL request.
methodstringGETMetode HTTP.
dataany-Data request. Untuk GET dan HEAD, data diserialisasi ke query string. Untuk metode lain, data ditulis ke body request.
headersRecord<string, string>{}Header request.
timeoutnumber-Timeout dalam milidetik. Hanya berlaku jika lebih besar dari 0.
dataType'json' | 'text' | 'html' | 'arrayBuffer'jsonMode parsing response.
contentTypestringapplication/x-www-form-urlencoded; charset=UTF-8Content-Type body request.
processDatabooleantrueApakah data diserialisasi otomatis. Set false untuk meneruskan data langsung sebagai body request.

Nilai balik:

FieldTipeDeskripsi
okbooleantrue untuk response HTTP 2xx; false untuk error parsing, error HTTP, timeout, abort, atau error jaringan.
statusnumberKode status HTTP. 0 menunjukkan timeout, abort, atau kegagalan level jaringan.
statusTextstringTeks status HTTP, atau timeout, abort, atau error untuk kegagalan non-HTTP.
dataanyData response yang sudah diparse, tersedia jika parsing berhasil.
errorstringPesan error, tersedia untuk kegagalan parsing atau kegagalan non-HTTP.
timeoutbooleantrue jika request dibatalkan oleh timeout yang dikonfigurasi.

Contoh:

js
const ret = await api.http.ajax({
  url: 'https://example.com/api/profile',
  method: 'GET',
  dataType: 'json',
  timeout: 10000
});

if (ret.ok) {
  console.log(ret.data);
}
js
const ret = await api.http.ajax({
  url: 'https://example.com/api/items',
  method: 'POST',
  contentType: 'application/json',
  data: { name: 'demo' }
});

api.user ​

api.user digunakan untuk membaca dan menulis data terkait pengguna selama skrip berjalan.

Parameter umum:

ParameterTipeDefaultDeskripsi
sitebooleanfalseApakah penyimpanan dipisah per situs.
accountbooleanfalseApakah penyimpanan dipisah per akun.
didbooleanfalseApakah penyimpanan dipisah per perangkat.

api.user.put(name, value, site, account, did) ​

Menyimpan pasangan key-value tertentu.

ts
put(
  name: string,
  value: string,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ status: boolean }>

Contoh:

js
await api.user.put('token', 'abc123');

api.user.get(name, site, account, did) ​

Membaca pasangan key-value tertentu.

ts
get(
  name: string,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ value: string | null, status: boolean }>

Contoh:

js
const ret = await api.user.get('token');
console.log(ret.value);

api.user.remove(name, site, account, did) ​

Menghapus pasangan key-value tertentu.

ts
remove(
  name: string,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ status: boolean }>

Contoh:

js
await api.user.remove('token');

api.user.incr(name, step, site, account, did) ​

Menambah nilai numerik key tertentu sesuai step. Jika key belum ada, key dibuat dengan nilai step.

ts
incr(
  name: string,
  step?: number,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ status: boolean, value: number | string }>

Contoh:

js
const ret = await api.user.incr('count', 1);
console.log(ret.value);

api.user.decr(name, step, site, account, did) ​

Mengurangi nilai numerik key tertentu sesuai step. Jika key belum ada, key dibuat dengan nilai step * -1.

ts
decr(
  name: string,
  step?: number,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ status: boolean, value: number | string }>

Contoh:

js
const ret = await api.user.decr('count', 1);
console.log(ret.value);

api.user.startsWith(prefix, site, account, did) ​

Mencari semua data yang nama key-nya diawali prefix tertentu.

ts
startsWith(
  prefix: string,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<Array<{ name: string, value: string }>>

Contoh:

js
const items = await api.user.startsWith('cache:');

api.user.countAll(name, site, account) ​

Menghitung jumlah record dengan nama key tertentu.

ts
countAll(
  name: string,
  site?: boolean,
  account?: boolean
): Promise<{ value: number, status: boolean }>

Contoh:

js
const ret = await api.user.countAll('token');
console.log(ret.value);

api.user.sumAll(name, site, account) ​

Menghitung jumlah numerik nilai untuk nama key tertentu.

ts
sumAll(
  name: string,
  site?: boolean,
  account?: boolean
): Promise<{ value: number, status: boolean }>

Contoh:

js
const ret = await api.user.sumAll('score');
console.log(ret.value);

api.dom ​

api.dom menyediakan query DOM, pengecekan visibilitas, listener koneksi, listener ukuran, dan pembuatan overlay.

Dukungan selector:

PolaDeskripsi
.button.primarySelector CSS.
xpath://div[@id="app"]Selector XPath.
.dialog:pMengembalikan elemen induk dari elemen yang cocok.
.dialog:p2Mengembalikan elemen induk dua level di atas elemen yang cocok.
.header:bottomMenggunakan batas bawah elemen target pada metode batas overlay.
.sidebar:rightMenggunakan batas kanan elemen target pada metode batas overlay.

api.dom.createMutationObserver(ele, bindStr, childList, subtree, attributes, characterData, fn) ​

Membuat dan menyimpan MutationObserver di cache. Jika ele[bindStr] sudah ada, observer yang ada langsung dikembalikan.

ts
createMutationObserver(
  ele: Element,
  bindStr: string,
  childList: boolean,
  subtree: boolean,
  attributes: boolean,
  characterData: boolean,
  fn: (mutations: MutationRecord[]) => void
): MutationObserver

Contoh:

js
api.dom.createMutationObserver(
  document.body,
  '__bodyObserver__',
  true,
  true,
  false,
  false,
  (mutations) => console.log(mutations)
);

api.dom.querySelector(doc, cssOrXPathSelector) ​

Mencari elemen pertama yang cocok.

ts
querySelector(doc: Document, cssOrXPathSelector: string): HTMLElement | null

Contoh:

js
const el = api.dom.querySelector(document, 'xpath://button[contains(.,"Submit")]');

api.dom.querySelectorAll(doc, cssOrXPathSelector) ​

Mencari semua elemen yang cocok.

ts
querySelectorAll(doc: Document, cssOrXPathSelector: string): HTMLElement[]

Contoh:

js
const buttons = api.dom.querySelectorAll(document, 'button.primary');

api.dom.isVisible(ele) ​

Menentukan apakah elemen berada pada area perpotongan yang terlihat.

ts
isVisible(ele: HTMLElement): Promise<boolean>

Contoh:

js
if (await api.dom.isVisible(el)) {
  console.log('visible');
}

api.dom.getVisibleRect(ele) ​

Mengambil persegi panjang area terlihat saat ini dari elemen.

ts
getVisibleRect(ele: HTMLElement): Promise<DOMRectReadOnly>

Contoh:

js
const rect = await api.dom.getVisibleRect(el);
console.log(rect.left, rect.top, rect.width, rect.height);

api.dom.getConnectListeners() ​

Mengambil daftar listener koneksi saat ini.

ts
getConnectListeners(): Array<{
  querySelector: string;
  callback: (isConnected: boolean) => void;
  isConnected?: boolean;
}>

Contoh:

js
api.dom.addConnectListener('.modal', () => {});
console.log(api.dom.getConnectListeners());

api.dom.addConnectListener(cssOrXPathSelector, callback) ​

Memantau apakah elemen target muncul di dokumen atau menghilang dari dokumen.

ts
addConnectListener(
  cssOrXPathSelector: string,
  callback: (isConnected: boolean) => void
): void

Contoh:

js
api.dom.addConnectListener('.dialog', (isConnected) => {
  console.log('dialog:', isConnected);
});

api.dom.removeConnectListener(cssOrXPathSelectors) ​

Menghapus listener koneksi untuk selector tertentu.

ts
removeConnectListener(cssOrXPathSelectors: string[]): void

Contoh:

js
api.dom.removeConnectListener(['.dialog', '.toast']);

api.dom.addResizeListener(cssOrXPathSelector, bindWindowStr, callback, createObserver, delayTime) ​

Memantau perubahan ukuran dan posisi elemen target. Jika elemen tidak ada, callback menerima new DOMRect(0, 0, 0, 0).

ts
addResizeListener(
  cssOrXPathSelector: string,
  bindWindowStr: string,
  callback: (rect: DOMRect) => void,
  createObserver?: boolean,
  delayTime?: number
): ResizeObserver | (() => void)

Contoh:

js
api.dom.addResizeListener('.target', '__targetResize__', (rect) => {
  console.log(rect.width, rect.height);
});

api.dom.createOverlayBy(cssOrXPathSelector, bindWindowStr, createObserver, delayTime, fn) ​

Membuat overlay fixed-position yang mengikuti area terlihat elemen target.

ts
createOverlayBy(
  cssOrXPathSelector: string,
  bindWindowStr: string,
  createObserver?: boolean,
  delayTime?: number,
  fn?: (rect: DOMRectReadOnly) => void
): HTMLElement

Contoh:

js
const overlay = api.dom.createOverlayBy('.target', '__overlay__');
overlay.style.border = '2px solid #f00';
overlay.style.pointerEvents = 'none';
overlay.style.zIndex = '999999';

api.dom.createOverlayByBorder(bindWindowStr, top, right, bottom, left, createObserver, delayTime) ​

Membuat overlay fixed-position dari empat sisi. Setiap sisi dapat berupa nilai piksel numerik atau selector; selector dapat memakai :top, :right, :bottom, :left.

ts
createOverlayByBorder(
  bindWindowStr: string,
  top: string | number,
  right: string | number,
  bottom: string | number,
  left: string | number,
  createObserver?: boolean,
  delayTime?: number
): HTMLElement

Contoh:

js
const panel = api.dom.createOverlayByBorder(
  '__centerPanel__',
  'header:bottom',
  20,
  'footer:top',
  '.sidebar:right'
);
panel.style.background = 'rgba(0,0,0,.08)';

api.utils ​

api.utils.wait(fn, timeoutMs, intervalMs) ​

Melakukan polling sampai fungsi kondisi mengembalikan nilai truthy.

ts
wait(
  fn: () => boolean,
  timeoutMs: number,
  intervalMs?: number
): Promise<void>

Setelah timeout, akan melempar Error("Timeout: function did not return true in time.").

Contoh:

js
await api.utils.wait(
  () => !!api.dom.querySelector(document, '.ready'),
  10000,
  200
);

api.utils.runScript(code, callback) ​

Menjalankan kode JavaScript di halaman saat ini.

ts
runScript(
  code: string,
  callback?: (result: any, error: Error) => void
): Promise<any>

Contoh:

js
const title = await api.utils.runScript('document.title');
console.log(title);

api.header(headerName, isRequestHeader) ​

Membaca header request atau response yang dicatat browser jarak jauh.

ts
header(
  headerName: string,
  isRequestHeader: boolean
): Promise<string | string[] | undefined>
ParameterTipeDeskripsi
headerNamestringNama header request atau response; dikonversi ke huruf kecil saat dibaca.
isRequestHeaderbooleantrue membaca header request, false membaca header response.

Catatan:

  • Hanya header yang ditambahkan di konfigurasi situs yang dicatat.
  • Header request berasal dari header yang dikirim browser jarak jauh.
  • Header response berasal dari header yang diterima browser jarak jauh.
  • Header response dapat mengembalikan array string.

Contoh:

js
const cookie = await api.header('cookie', true);
const setCookie = await api.header('set-cookie', false);

Sa2web 1.0.0