@kyncode/sdk 0.1.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 +231 -0
- package/dist/index.cjs +1434 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +103 -0
- package/dist/index.d.ts +103 -0
- package/dist/index.js +1404 -0
- package/dist/index.js.map +1 -0
- package/package.json +65 -0
package/README.md
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# @kyncode/sdk
|
|
2
|
+
|
|
3
|
+
SDK oficial de KYNCODE para verificar la conexión de una aplicación y capturar
|
|
4
|
+
errores de servidor en Next.js y Node.js.
|
|
5
|
+
|
|
6
|
+
Requiere Node.js 22 o una versión posterior con soporte vigente.
|
|
7
|
+
|
|
8
|
+
## Instalación
|
|
9
|
+
|
|
10
|
+
Instalalo desde npm en tu aplicación:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @kyncode/sdk
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Credencial
|
|
17
|
+
|
|
18
|
+
Guardá la API key del proyecto como un secreto en la plataforma donde desplegás
|
|
19
|
+
la aplicación:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
KYNCODE_API_KEY=kyn_live_...
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
No la incluyas en el repositorio, no la expongas al navegador y no uses un
|
|
26
|
+
nombre público como `NEXT_PUBLIC_KYNCODE_API_KEY`.
|
|
27
|
+
|
|
28
|
+
Esa es la única variable necesaria para conectar el SDK. El destino de ingestión
|
|
29
|
+
es interno, compartido por todas las instalaciones y no debe configurarse en la
|
|
30
|
+
aplicación del usuario.
|
|
31
|
+
|
|
32
|
+
## Next.js
|
|
33
|
+
|
|
34
|
+
Creá `instrumentation.ts` en la raíz de la aplicación, o dentro de `src/` si el
|
|
35
|
+
proyecto utiliza esa estructura:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
export { onRequestError, register } from '@kyncode/sdk';
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`register` verifica proactivamente la conexión con KYNCODE cuando inicia el
|
|
42
|
+
servidor. `onRequestError` captura los errores globales que Next.js entrega a su
|
|
43
|
+
instrumentación. El hook registra la entrega en `waitUntil` cuando el runtime
|
|
44
|
+
expone un contexto compatible y vuelve apenas queda programada. Si ese contexto
|
|
45
|
+
no existe, espera un único intento de hasta 2 segundos para respetar el lifecycle
|
|
46
|
+
de Next.js sin prolongar repetidamente una respuesta fallida. No necesitás crear
|
|
47
|
+
una ruta en tu aplicación.
|
|
48
|
+
|
|
49
|
+
Si además querés proteger de forma explícita un Route Handler o una Server
|
|
50
|
+
Action, podés envolverla con `Loly.shield`:
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { Loly } from '@kyncode/sdk';
|
|
54
|
+
|
|
55
|
+
export const POST = Loly.shield(async (request: Request) => {
|
|
56
|
+
return Response.json(await request.json());
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
La instrumentación global suele ser suficiente. Evitá combinarla con
|
|
61
|
+
`Loly.shield` sobre el mismo flujo salvo que necesites contexto explícito: el SDK
|
|
62
|
+
deduplica el mismo error durante 5 segundos, pero mantener una sola estrategia es
|
|
63
|
+
más simple y predecible.
|
|
64
|
+
|
|
65
|
+
## Node.js
|
|
66
|
+
|
|
67
|
+
En un proceso Node.js sin framework HTTP, verificá la conexión una vez durante
|
|
68
|
+
el arranque y protegé explícitamente los trabajos que quieras observar:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { Loly, type ConnectivityDiagnostic } from '@kyncode/sdk';
|
|
72
|
+
|
|
73
|
+
const connection: ConnectivityDiagnostic = await Loly.connect('Node.js');
|
|
74
|
+
if (!connection.ok) {
|
|
75
|
+
console.warn(`KYNCODE no conectado: ${connection.status} — ${connection.message}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const runProtectedJob = Loly.shield(async () => {
|
|
79
|
+
// Trabajo de la aplicación.
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`Loly.shield` captura el error y vuelve a lanzar exactamente el mismo valor para
|
|
84
|
+
preservar el comportamiento de la aplicación. Para un servidor HTTP usá el
|
|
85
|
+
adaptador de su framework.
|
|
86
|
+
|
|
87
|
+
`Loly.connect()` siempre devuelve un diagnóstico tipado. `status` puede ser
|
|
88
|
+
`connected`, `disabled`, `failed`, `invalid_api_key` o `rate_limited`; también
|
|
89
|
+
incluye el runtime y, cuando corresponde, el status HTTP.
|
|
90
|
+
|
|
91
|
+
## Privacidad y configuración
|
|
92
|
+
|
|
93
|
+
Los cuerpos de requests y argumentos se excluyen por defecto. Activarlos es una
|
|
94
|
+
decisión explícita porque pueden contener información sensible:
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
Loly.init({
|
|
98
|
+
captureBody: true,
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
La sanitización sigue aplicándose, pero no sustituye una política de minimización
|
|
103
|
+
de datos. También se puede usar `KYNCODE_CAPTURE_REQUEST_BODY=true` únicamente en
|
|
104
|
+
el entorno de servidor.
|
|
105
|
+
|
|
106
|
+
Las URLs se minimizan siempre: el SDK conserva los nombres de los parámetros de
|
|
107
|
+
query para identificar la forma de la solicitud, pero reemplaza todos sus
|
|
108
|
+
valores. Códigos OAuth, estados CSRF, OTP, firmas y filtros nunca se incluyen en
|
|
109
|
+
el evento.
|
|
110
|
+
|
|
111
|
+
El SDK queda desactivado por defecto cuando `NODE_ENV=test`; para un test de
|
|
112
|
+
integración del transporte configurá `enabled: true` de forma explícita.
|
|
113
|
+
|
|
114
|
+
## Apagado y errores fatales de Node.js
|
|
115
|
+
|
|
116
|
+
Los adaptadores despachan en segundo plano. Antes de terminar un worker o un
|
|
117
|
+
servidor, `Loly.flush()` permite esperar de forma acotada:
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
const result = await Loly.flush({ timeoutMs: 2_000 });
|
|
121
|
+
|
|
122
|
+
if (result.timedOut) {
|
|
123
|
+
console.warn(`Quedaron ${result.pending} eventos pendientes`);
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Para observar fallos fatales del proceso sin impedir que Node finalice con código
|
|
128
|
+
no cero, registrá el monitor y conservá su función de limpieza:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
const stopMonitoring = Loly.listenToProcessEvents();
|
|
132
|
+
|
|
133
|
+
// Durante un cierre controlado:
|
|
134
|
+
stopMonitoring();
|
|
135
|
+
await Loly.flush({ timeoutMs: 2_000 });
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
El monitor no instala un manejador de `uncaughtException` ni altera la semántica
|
|
139
|
+
fatal de una excepción no capturada o un rechazo no manejado.
|
|
140
|
+
|
|
141
|
+
## Express
|
|
142
|
+
|
|
143
|
+
Verificá la conexión al arrancar. Después de las rutas, instalá el middleware de
|
|
144
|
+
KYNCODE antes de cualquier manejador final de errores propio:
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
import express from 'express';
|
|
148
|
+
import { Loly } from '@kyncode/sdk';
|
|
149
|
+
|
|
150
|
+
const app = express();
|
|
151
|
+
|
|
152
|
+
await Loly.connect('Express');
|
|
153
|
+
|
|
154
|
+
// Definí aquí las rutas de la aplicación.
|
|
155
|
+
app.use(Loly.expressErrorHandler());
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
El middleware captura el error y luego lo entrega a `next(error)`, por lo que no
|
|
159
|
+
interrumpe la cadena de manejo de errores de Express.
|
|
160
|
+
|
|
161
|
+
## Fastify
|
|
162
|
+
|
|
163
|
+
Verificá la conexión al arrancar y registrá el manejador global:
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
import Fastify from 'fastify';
|
|
167
|
+
import { Loly } from '@kyncode/sdk';
|
|
168
|
+
|
|
169
|
+
const fastify = Fastify();
|
|
170
|
+
|
|
171
|
+
await Loly.connect('Fastify');
|
|
172
|
+
fastify.setErrorHandler(Loly.fastifyErrorHandler());
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
El manejador captura el error y lo envía mediante la respuesta de Fastify. Si la
|
|
176
|
+
aplicación ya define un `setErrorHandler`, integrá KYNCODE en una única estrategia
|
|
177
|
+
global para no reemplazar accidentalmente el comportamiento existente.
|
|
178
|
+
|
|
179
|
+
## Qué hace la conexión proactiva
|
|
180
|
+
|
|
181
|
+
`register` y `Loly.connect()` envían una señal de conectividad durante el
|
|
182
|
+
arranque. `register` realiza un único intento con un límite corto para no
|
|
183
|
+
prolongar el cold start de Next.js; `Loly.connect()` mantiene los reintentos y el
|
|
184
|
+
diagnóstico completo para verificaciones explícitas. La señal confirma que la
|
|
185
|
+
credencial está configurada y que la aplicación puede comunicarse con KYNCODE
|
|
186
|
+
sin esperar a que ocurra un error.
|
|
187
|
+
|
|
188
|
+
La señal de conectividad no analiza por sí sola el código ni afirma que no haya
|
|
189
|
+
vulnerabilidades. Para realizar un inventario o análisis del repositorio también
|
|
190
|
+
debe existir una fuente de código autorizada en KYNCODE.
|
|
191
|
+
|
|
192
|
+
## Validación y publicación
|
|
193
|
+
|
|
194
|
+
Desde `packages/sdk`, un mantenedor puede reproducir la validación completa antes
|
|
195
|
+
de publicar:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
npm ci
|
|
199
|
+
npm run release:check
|
|
200
|
+
npm run ci:check
|
|
201
|
+
npm publish --dry-run
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
`release:check` limpia artefactos anteriores, ejecuta el typecheck estricto y los
|
|
205
|
+
tests, genera ESM y CommonJS con sus declaraciones y source maps, crea el tarball
|
|
206
|
+
real, lo valida con publint y Are The Types Wrong, y finalmente lo instala en un
|
|
207
|
+
proyecto temporal que prueba `import`, `require` y ambos modos de TypeScript. El
|
|
208
|
+
mismo tarball también se instala con dependencias fijadas en una aplicación mínima
|
|
209
|
+
de Next.js 16.3.2, se compila con Turbopack y Webpack, se ejecutan rutas reales en
|
|
210
|
+
Node y Edge, y se comprueba una entrega real de `onRequestError`.
|
|
211
|
+
`ci:check` repite el proceso desde una copia limpia usando exclusivamente el
|
|
212
|
+
`package-lock.json` propio del SDK. Los gates completos forman parte de
|
|
213
|
+
`prepack`, por lo que un `npm publish` directo no los evita; `postpack` comprueba
|
|
214
|
+
además que los artefactos ESM y CommonJS recién empaquetados sigan siendo
|
|
215
|
+
importables y expongan la versión correcta.
|
|
216
|
+
|
|
217
|
+
El paquete está configurado como scoped público en el registro oficial de npm.
|
|
218
|
+
La publicación efectiva requiere una sesión npm autorizada para el scope
|
|
219
|
+
`@kyncode`:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
npm whoami
|
|
223
|
+
npm publish
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Decisión legal pendiente
|
|
227
|
+
|
|
228
|
+
La licencia permanece deliberadamente como `UNLICENSED`. No se debe realizar una
|
|
229
|
+
publicación pública hasta que KYNCODE autorice su distribución y defina la
|
|
230
|
+
licencia aplicable. No se agregaron autor, repositorio ni homepage porque esos
|
|
231
|
+
datos no están confirmados en el proyecto.
|