{"id":20026363,"url":"https://github.com/mirdware/resource","last_synced_at":"2026-01-25T10:31:25.802Z","repository":{"id":63824975,"uuid":"570596143","full_name":"mirdware/resource","owner":"mirdware","description":"Async resources with webworkers","archived":false,"fork":false,"pushed_at":"2024-08-20T20:36:18.000Z","size":56,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-28T20:54:28.998Z","etag":null,"topics":["ajax","javascript","library","request","resource","rest-api","web-worker"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mirdware.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-11-25T15:16:09.000Z","updated_at":"2024-08-20T20:36:21.000Z","dependencies_parsed_at":"2024-01-12T12:56:16.910Z","dependency_job_id":"36ff60ab-e95e-4709-bd01-ef25ebc52604","html_url":"https://github.com/mirdware/resource","commit_stats":{"total_commits":10,"total_committers":1,"mean_commits":10.0,"dds":0.0,"last_synced_commit":"9cc0eb8064897d386a1951b878e4db2af6c582e2"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mirdware/resource","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirdware%2Fresource","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirdware%2Fresource/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirdware%2Fresource/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirdware%2Fresource/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mirdware","download_url":"https://codeload.github.com/mirdware/resource/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirdware%2Fresource/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28751816,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T10:25:12.305Z","status":"ssl_error","status_checked_at":"2026-01-25T10:25:11.933Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ajax","javascript","library","request","resource","rest-api","web-worker"],"created_at":"2024-11-13T09:06:27.954Z","updated_at":"2026-01-25T10:31:25.781Z","avatar_url":"https://github.com/mirdware.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @spawm/resource\nLa idea detrás de este proyecto es generar peticiones hacia un servicio RESTful de manera natural. El nombre de la librería esta dado porque los recursos son el bloque de compilación básico para la creación de un servicio RESTful.\n\nLos recursos los direccionan las URL y los métodos HTTP pueden llevar a cabo operaciones en recursos. Los recursos pueden tener diversas representaciones que utilicen distintos formatos como, por ejemplo, XML y JSON. Puede utilizar cabeceras y parámetros HTTP para pasar información adicional que sea relevante para la solicitud y la respuesta.\n\n## Instalación\nMediante node se puede instalar con el comando `npm i @spawm/resource` o manualmente haciendo uso del [CDN](https://unpkg.com/@spawm/resource).\n\n## Configuración\n\nEs posible configurar la petición enviando como segundo parámetro del constructor de `Resource` los siguientes datos:\n\n* **headers:** `[{'X-Requested-With': 'XMLHttpRequest'}]` Las cabeceras que enviara la petición, por defecto solo se envía la cabecera `X-Requested-With`, cabe recordar que una vez agregada una cabecera no es posible eliminarla.\n\n* **redirect:** `true` si el servidor responde desde una ubicación diferente a la cual fue realizada la petición, el sistema realizara una redirección hacia esta nueva URL.\n\n* **type:** son los tipos de respuesta que se esperan del servidor según el [responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType). Si se deja vacío, la librería tratará de parsearlo según las cabeceras de respuesta del servidor.\n\n* **cache:** Valor numérico que indica cuantos segundos dura la respuesta siendo válida antes de volver a hacer una nueva petición, solo funciona en peticiones GET.\n\n## Uso\nPara utilizar un recurso basta con crear una instancia nueva de la clase Resource.\n\n```javascript\nimport Resource from '@spawm/resource';\n\nconst user = new Resource('https://sespesoft.com/response.json');\n```\n\nUna vez creado un objeto se pueden invocar sus métodos `get`, `post`, `put`, `delete`, `patch` o `send`, este último se usa para crear una petición diferente a las mencionadas anteriormente (TRACE, OPTIONS, HEAD, CONNECT). Con lo mencionado por ahora no dista mucho del uso de [fetch](https://developer.mozilla.org/es/docs/Web/API/Fetch_API) y es acá donde cabe recordar que Resource es una clase y como tal la podemos usar para aprovechar todas las características de la programación orientada a objetos; como por ejemplo la herencia.\n\n```javascript\nclass AppResource extends Resource {\n  constructor(path) {\n    super('http://localhost:8080/' + path, {\n      headers:  {\n        \"Authorization\": \"Basic YWxhZGRpbjpvcGVuc2VzYW1l\"\n      },\n      redirect: false,\n      type: \"json\",\n      cache: 60\n    });\n  }\n}\n```\n\nSi se cuenta con un sistema de inversión de control, es posible incluir la clase como un repositorio, con lo cual manejaremos un único objeto durante todo el ciclo de vida de la aplicación. Cabe resaltar el uso de [web workers](https://developer.mozilla.org/es/docs/Web/Guide/Performance/Usando_web_workers) para enviar peticiones, esto permite que toda petición realizada con Resource se realice en segundo plano.\n\n## Métodos\n\n* **get:** El método `get` solicita una representación de un recurso específico. Las peticiones que usan el método GET solo deben recuperar datos. Solo acepta como parámetro un objeto que convertirá en el query string.\n\n* **post:** El método `post` se utiliza para enviar una entidad a un recurso en específico, causando a menudo un cambio en el estado o efectos secundarios en el servidor. Recibe dos objetos como parámetros, el primero es el que se enviara dentro del cuerpo del mensaje y el segundo opcional un query string.\n\n* **put:** El modo `put` reemplaza todas las representaciones actuales del recurso de destino con la carga útil de la petición. Recibe dos objetos como parámetros, el primero es el que se enviara dentro del cuerpo del mensaje y el segundo opcional un query string.\n\n* **delete:** El método `delete` borra un recurso en específico. Solo acepta como parámetro un objeto que convertirá en el query string.\n\n* **patch:** El método `patch` es utilizado para aplicar modificaciones parciales a un recurso. Recibe dos objetos como parámetros, el primero es el que se enviara dentro del cuerpo del mensaje y el segundo opcional un query string.\n\n* **send:** El método `send` envía cualquier tipo de petición al servidor, podemos pensar en los anteriores métodos como alias de este. Recibe tres parámetros, el primero es un string con el nombre del método por el cual se envía la petición, el segundo el objeto que se enviara en el cuerpo de la petición y el último el query string, igualmente como objeto javascript.\n\n* **add:** El método `add` no envía peticiones al servidor, su función es crear un nuevo recurso sobreescribiendo las propiedades de quien llama el método; el nuevo recurso **no** puede volver a llamar al método add. Por ejemplo un recurso `/posts/1` podría tener una URL `/posts/1/comments` donde se listan los comentarios del post, para esta situación tendríamos el siguiente caso:\n\n```javascript\nconst Resource = new Resource('/posts/{id}');\n// Carga todos los recursos\nresource.get().then(res =\u003e console.log(res));\n//carga solo el recurso 1\nresource.get({ id: 1 }).then(res =\u003e console.log(res));\n//carga los comentarios del recurso 1\nresource.add('/comments').get({ id: 1 });\n```\n\nEl método add recibe dos parametros, el primero es la url a añadir al recurso y el segundo un objeto el cual tiene las propiedades: `headers`, `redirect`, `cache` y `type`; en el caso de la primera propiedad lo que se envíe se agregara a los headers ya existentes, mientras que para el resto se sobreescribira en caso de ya existir.\n\n## Revalidate\n\n _:warning: En futuras versiones este método puede cambiar._\n\nCapítulo aparte merece el método revalidate, el cual permite ejecutar peticiones en diferentes momentos y con diferentes estrategias, esto para tratar de mantener la información lo más actualizada posible haciendo uso de un método de invalidación de caché llamado Stale While Relavidate popularizado por [HTTP RFC 5861](https://datatracker.ietf.org/doc/html/rfc5861).\n\nEl método recibe dos parámetros, la función que se ejecuta en cada una de las revalidaciones y un objeto de opciones.\n\n```javascript\nthis.revalidate(async (resource) =\u003e {\n  const persons = await resource.get();\n  console.log(persons)\n}, {\n  focus: 10,\n  reconnect: 0,\n  stale: 20\n});\n```\n\nComo se puede observar la función recibe como parámetro un resource con el cual se deben realizar las peticiones y las opciones que permite el método son `focus`, `reconnect` y `stale`,\n\n* **focus:** Estima el tiempo en segundos que se debe esperar para revalidar el estado cuando el usuario coloque el foco en la aplicación, es decir, si el usuario coloca el foco y no ha pasado menos del tiempo parametrizado, no se ejecutará la revalidación.\n\n* **reconnect:** Estima el tiempo en segundos que se debe esperar para revalidar el estado una vez la aplicación se ha reconectado.\n\n* **stale:** Estima cada cuantos segundos se debe enviar una petición para revalidar el estado, se debe pensar en esta opción como un [setInterval](https://developer.mozilla.org/en-US/docs/Web/API/setInterval) que realizará un long polling al servidor.\n\nSi el estado ha cambiado teniendo en cuenta las condiciones establecidas por el objeto de parametrización, se ejecutará la función enviada como primer parámetro.\n\n## Evitando los interceptores\nOtra funcionalidad de la programación orientada a objetos que podemos usar es el polimorfismo, lo cual nos permite modificar peticiones o respuestas; tareas delegadas en la mayoría de casos a interceptores.\n\nComo se mencionó anteriormente, send es el método principal y sobre el cual se realizan todas las peticiones al servidor y este puede ser sobreescrito por herencia como vimos en el pasado ejemplo.\n\n```javascript\nclass AppResource extends Resource {\n  async send(method, body, query) {\n    const response = await super.send(method, body, query);\n    response.at = new Date();\n    return reponse;\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmirdware%2Fresource","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmirdware%2Fresource","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmirdware%2Fresource/lists"}