@pimia/sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,13 +12,10 @@ Requisitos: Node ≥ 20 (o cualquier runtime con `fetch` y WebCrypto global).
12
12
  npm install @pimia/sdk
13
13
  ```
14
14
 
15
- > **Pendiente del primer publish en npm.** El repositorio ya es **público**,
16
- > así que mientras tanto no hace falta invitación: clona
17
- > `Pimia-AI/pimia-sdks`, compila este directorio (`npm ci && npm run build`) e
18
- > instálalo por ruta (`npm install /ruta/a/pimia-sdks/typescript`) o como
19
- > tarball (`npm pack`). Ojo, `npm install git+https://…` **no** vale: npm
20
- > instalaría la raíz del monorepo, no `typescript/`. El detalle está en el
21
- > [README del monorepo](https://github.com/Pimia-AI/pimia-sdks#instalación).
15
+ Publicado desde v0.1.0, con
16
+ [provenance SLSA](https://docs.npmjs.com/generating-provenance-statements)
17
+ firmada por el workflow de release: el tarball es verificablemente
18
+ [este repositorio](https://github.com/Pimia-AI/pimia-sdks).
22
19
 
23
20
  ## Uso en 20 líneas
24
21
 
@@ -66,6 +63,35 @@ cliente exige un `TokenStore` en lugar de un string: persiste el conjunto de
66
63
  tokens tras cada refresco y no refresques dos veces en paralelo con el mismo
67
64
  token. Las dos cosas las cubre el SDK si lo usas como está pensado.
68
65
 
66
+ ## Reintentar un `POST` sin duplicar
67
+
68
+ Manda una `Idempotency-Key` única por operación y Pimia ejecuta la escritura
69
+ una sola vez, por muchos reintentos que haya:
70
+
71
+ ```ts
72
+ const clave = crypto.randomUUID()
73
+ await client.estimates.create(presupuesto, { idempotencyKey: clave })
74
+ ```
75
+
76
+ Reúsala **solo** en los reintentos de esa misma operación: la misma clave con
77
+ otro cuerpo responde `422`.
78
+
79
+ Tras un reintento el cuerpo que recibes es idéntico al de la primera llamada
80
+ —ese es justo el contrato—, así que el cuerpo solo no dice si Pimia escribió o
81
+ se limitó a repetirse. Para saberlo, `requestWithMeta`:
82
+
83
+ ```ts
84
+ const { data, meta } = await client.requestWithMeta('/estimates', {
85
+ method: 'POST',
86
+ body: presupuesto,
87
+ idempotencyKey: clave,
88
+ })
89
+
90
+ if (meta.idempotentReplay) {
91
+ // ya existía: no se ha creado nada nuevo
92
+ }
93
+ ```
94
+
69
95
  ## Más
70
96
 
71
97
  Documentación completa, modelo mental (un tenant = una base URL = un token),