Skip to content

Apéndice de API de scripts

Objetivo

Describe las capacidades de window.api disponibles para scripts de página del sitio y scripts de interceptación de API, incluidas lectura de configuración, solicitudes HTTP, datos de usuario, herramientas DOM, utilidades generales y lectura de encabezados de solicitud/respuesta.

Los scripts de página y los scripts de interceptación de API normal pueden usar window.api. Los scripts SSE solo garantizan que se pase data y normalmente no dependen de 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

Lee la configuración personalizada del entorno de scripts del sitio.

ts
config: Record<string, unknown>

Ejemplo:

js
const apiBase = api.config.apiBase;

api.http

api.http proporciona helpers HTTP para scripts de usuario. api.http.ajax ejecuta la solicitud real en el proceso principal del navegador, por lo que no está restringido por la política CORS de la página.

api.http.ajax(options)

Envía una solicitud 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;
}>
OpciónTipoValor predeterminadoDescripción
urlstring-URL de la solicitud.
methodstringGETMétodo HTTP.
dataany-Datos de la solicitud. Para GET y HEAD, se serializa en la cadena de consulta. Para otros métodos, se escribe en el cuerpo de la solicitud.
headersRecord<string, string>{}Encabezados de la solicitud.
timeoutnumber-Tiempo de espera en milisegundos. Solo se aplica cuando es mayor que 0.
dataType'json' | 'text' | 'html' | 'arrayBuffer'jsonModo de análisis de la respuesta.
contentTypestringapplication/x-www-form-urlencoded; charset=UTF-8Content-Type del cuerpo de la solicitud.
processDatabooleantrueSi se serializa automáticamente data. Use false para pasar data directamente como cuerpo de la solicitud.

Valor devuelto:

CampoTipoDescripción
okbooleantrue para respuestas HTTP 2xx; false para errores de análisis, errores HTTP, timeout, abort o errores de red.
statusnumberCódigo de estado HTTP. 0 indica timeout, abort o fallo de nivel de red.
statusTextstringTexto de estado HTTP, o timeout, abort o error para fallos no HTTP.
dataanyDatos de respuesta analizados, presentes cuando el análisis tiene éxito.
errorstringMensaje de error, presente en fallos de análisis o fallos no HTTP.
timeoutbooleantrue cuando la solicitud fue abortada por el timeout configurado.

Ejemplos:

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 se usa para leer y escribir datos asociados al usuario durante la ejecución del script.

Parámetros comunes:

ParámetroTipoValor predeterminadoDescripción
sitebooleanfalseSi se almacena por sitio.
accountbooleanfalseSi se almacena por cuenta.
didbooleanfalseSi se almacena por dispositivo.

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

Guarda el par clave-valor especificado.

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

Ejemplo:

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

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

Lee el par clave-valor especificado.

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

Ejemplo:

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

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

Elimina el par clave-valor especificado.

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

Ejemplo:

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

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

Aumenta el valor numérico de la clave por el paso. Si no existe, se crea con step.

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

Ejemplo:

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

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

Disminuye el valor numérico de la clave por el paso. Si no existe, se crea con step * -1.

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

Ejemplo:

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

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

Busca todos los datos cuyo nombre de clave empieza con el prefijo especificado.

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

Ejemplo:

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

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

Cuenta registros con el nombre de clave especificado.

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

Ejemplo:

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

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

Calcula la suma numérica de los valores del nombre de clave especificado.

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

Ejemplo:

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

api.dom

api.dom ofrece consultas DOM, comprobación de visibilidad, listeners de conexión, listeners de tamaño y creación de overlays.

Selectores admitidos:

FormatoDescripción
.button.primarySelector CSS.
xpath://div[@id="app"]Selector XPath.
.dialog:pDevuelve el elemento padre del elemento coincidente.
.dialog:p2Devuelve el padre dos niveles por encima del elemento coincidente.
.header:bottomUsa el borde inferior del elemento objetivo en métodos de borde de overlay.
.sidebar:rightUsa el borde derecho del elemento objetivo en métodos de borde de overlay.

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

Crea y almacena en caché un MutationObserver. Si ele[bindStr] ya existe, devuelve directamente el observer existente.

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

Ejemplo:

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

api.dom.querySelector(doc, cssOrXPathSelector)

Consulta el primer elemento coincidente.

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

Ejemplo:

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

api.dom.querySelectorAll(doc, cssOrXPathSelector)

Consulta todos los elementos coincidentes.

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

Ejemplo:

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

api.dom.isVisible(ele)

Determina si el elemento está en un área de intersección visible.

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

Ejemplo:

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

api.dom.getVisibleRect(ele)

Obtiene el rectángulo visible actual del elemento.

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

Ejemplo:

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

api.dom.getConnectListeners()

Obtiene la lista actual de listeners de conexión.

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

Ejemplo:

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

api.dom.addConnectListener(cssOrXPathSelector, callback)

Escucha si el elemento objetivo aparece en el documento o desaparece de él.

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

Ejemplo:

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

api.dom.removeConnectListener(cssOrXPathSelectors)

Elimina listeners de conexión para los selectores especificados.

ts
removeConnectListener(cssOrXPathSelectors: string[]): void

Ejemplo:

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

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

Escucha cambios de tamaño y posición del elemento objetivo. Si el elemento no existe, el callback recibe new DOMRect(0, 0, 0, 0).

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

Ejemplo:

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

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

Crea un overlay de posición fija que sigue el área visible del elemento objetivo.

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

Ejemplo:

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)

Crea un overlay de posición fija mediante cuatro bordes. Cada borde puede ser un valor numérico en píxeles o un selector; los selectores pueden usar :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

Ejemplo:

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)

Hace polling hasta que la función de condición devuelve un valor verdadero.

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

Al expirar, lanza Error("Timeout: function did not return true in time.").

Ejemplo:

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

api.utils.runScript(code, callback)

Ejecuta código JavaScript en la página actual.

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

Ejemplo:

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

api.header(headerName, isRequestHeader)

Lee encabezados de solicitud o respuesta registrados por el navegador remoto.

ts
header(
  headerName: string,
  isRequestHeader: boolean
): Promise<string | string[] | undefined>
ParámetroTipoDescripción
headerNamestringNombre de encabezado de solicitud o respuesta; se convierte a minúsculas al leerse.
isRequestHeaderbooleantrue lee encabezados de solicitud; false lee encabezados de respuesta.

Notas:

  • Solo se registran encabezados agregados en la configuración del sitio.
  • Los encabezados de solicitud provienen de los headers enviados por el navegador remoto.
  • Los encabezados de respuesta provienen de los headers recibidos por el navegador remoto.
  • Los encabezados de respuesta pueden devolver arrays de cadenas.

Ejemplo:

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

Sa2web 1.0.0