@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 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.