@neetru/sdk 3.7.0 → 3.8.1
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/CHANGELOG.md +75 -0
- package/README.md +66 -1
- package/dist/ai.cjs +221 -177
- package/dist/ai.d.cts +1 -1
- package/dist/ai.d.ts +1 -1
- package/dist/ai.mjs +221 -177
- package/dist/auth.cjs +1051 -868
- package/dist/auth.d.cts +1 -1
- package/dist/auth.d.ts +1 -1
- package/dist/auth.mjs +1048 -865
- package/dist/catalog.cjs +164 -97
- package/dist/catalog.d.cts +1 -1
- package/dist/catalog.d.ts +1 -1
- package/dist/catalog.mjs +164 -97
- package/dist/checkout.cjs +182 -115
- package/dist/checkout.d.cts +1 -1
- package/dist/checkout.d.ts +1 -1
- package/dist/checkout.mjs +181 -114
- package/dist/db-react.d.cts +1 -1
- package/dist/db-react.d.ts +1 -1
- package/dist/db.cjs +437 -345
- package/dist/db.d.cts +1 -1
- package/dist/db.d.ts +1 -1
- package/dist/db.mjs +455 -363
- package/dist/entitlements.cjs +17 -10
- package/dist/entitlements.d.cts +1 -1
- package/dist/entitlements.d.ts +1 -1
- package/dist/entitlements.mjs +17 -10
- package/dist/errors.cjs +15 -8
- package/dist/errors.d.cts +24 -3
- package/dist/errors.d.ts +24 -3
- package/dist/errors.mjs +14 -7
- package/dist/firestore-compat.d.cts +1 -1
- package/dist/firestore-compat.d.ts +1 -1
- package/dist/index.cjs +1544 -1190
- package/dist/index.d.cts +177 -3
- package/dist/index.d.ts +177 -3
- package/dist/index.mjs +1676 -1329
- package/dist/mobile.cjs +400 -181
- package/dist/mobile.d.cts +59 -4
- package/dist/mobile.d.ts +59 -4
- package/dist/mobile.mjs +400 -181
- package/dist/mocks.cjs +9 -2
- package/dist/mocks.d.cts +1 -1
- package/dist/mocks.d.ts +1 -1
- package/dist/mocks.mjs +9 -2
- package/dist/notifications.cjs +197 -130
- package/dist/notifications.d.cts +1 -1
- package/dist/notifications.d.ts +1 -1
- package/dist/notifications.mjs +196 -129
- package/dist/react.cjs +303 -282
- package/dist/react.d.cts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.mjs +295 -274
- package/dist/support.cjs +299 -229
- package/dist/support.d.cts +8 -4
- package/dist/support.d.ts +8 -4
- package/dist/support.mjs +298 -228
- package/dist/telemetry.cjs +234 -167
- package/dist/telemetry.d.cts +1 -1
- package/dist/telemetry.d.ts +1 -1
- package/dist/telemetry.mjs +234 -167
- package/dist/{types-Dx0IrOSF.d.ts → types-BYPk_3HR.d.ts} +104 -17
- package/dist/{types-Bx4kTLmk.d.cts → types-yv3EDKg2.d.cts} +104 -17
- package/dist/usage.cjs +183 -116
- package/dist/usage.d.cts +1 -1
- package/dist/usage.d.ts +1 -1
- package/dist/usage.mjs +183 -116
- package/dist/webhooks.cjs +215 -148
- package/dist/webhooks.d.cts +1 -1
- package/dist/webhooks.d.ts +1 -1
- package/dist/webhooks.mjs +212 -145
- package/package.json +2 -1
package/dist/telemetry.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/errors.ts
|
|
2
|
-
var
|
|
2
|
+
var d = class e extends Error {
|
|
3
3
|
code;
|
|
4
4
|
status;
|
|
5
5
|
requestId;
|
|
@@ -12,183 +12,250 @@ var a = class e extends Error {
|
|
|
12
12
|
* para um `NeetruDbErrorCode` mais específico (recuperável vs não).
|
|
13
13
|
*/
|
|
14
14
|
reason;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/**
|
|
16
|
+
* 3.8.0: `x-correlation-id` da requisição que falhou. O SDK gera um UUID por
|
|
17
|
+
* chamada (ou usa o que o chamador passou) e manda no header; o Core grava o
|
|
18
|
+
* mesmo id nos logs/auditoria — cite-o ao abrir um ticket de suporte.
|
|
19
|
+
* `undefined` em erros que acontecem antes de qualquer requisição.
|
|
20
|
+
*/
|
|
21
|
+
correlationId;
|
|
22
|
+
constructor(t, n, o, i, u, r) {
|
|
23
|
+
super(n), this.name = "NeetruError", this.code = t, this.status = o, this.requestId = i, this.reason = u, this.correlationId = r, Object.setPrototypeOf(this, e.prototype);
|
|
17
24
|
}
|
|
18
25
|
};
|
|
19
26
|
|
|
20
27
|
// src/idempotency.ts
|
|
21
|
-
function
|
|
28
|
+
function I() {
|
|
22
29
|
let e = typeof globalThis < "u" && "crypto" in globalThis ? globalThis.crypto : void 0;
|
|
23
30
|
if (e && typeof e.randomUUID == "function")
|
|
24
31
|
return e.randomUUID();
|
|
25
|
-
throw new
|
|
32
|
+
throw new d(
|
|
26
33
|
"runtime_unsupported",
|
|
27
34
|
"crypto.randomUUID not available in this runtime. SDK 3.0 requires Node \u226520 or modern browser/Edge."
|
|
28
35
|
);
|
|
29
36
|
}
|
|
30
37
|
|
|
38
|
+
// src/correlation.ts
|
|
39
|
+
var A = "x-correlation-id";
|
|
40
|
+
var j = /^[A-Za-z0-9._:\-]+$/;
|
|
41
|
+
function S(e) {
|
|
42
|
+
return typeof e == "string" && e.length > 0 && e.length <= 128 && j.test(e);
|
|
43
|
+
}
|
|
44
|
+
function H() {
|
|
45
|
+
let e = globalThis.crypto;
|
|
46
|
+
try {
|
|
47
|
+
if (e && typeof e.randomUUID == "function") return e.randomUUID();
|
|
48
|
+
} catch {
|
|
49
|
+
}
|
|
50
|
+
let t = new Uint8Array(16), n = false;
|
|
51
|
+
try {
|
|
52
|
+
e && typeof e.getRandomValues == "function" && (e.getRandomValues(t), n = !0);
|
|
53
|
+
} catch {
|
|
54
|
+
n = false;
|
|
55
|
+
}
|
|
56
|
+
if (!n)
|
|
57
|
+
for (let i = 0; i < t.length; i++) t[i] = Math.floor(Math.random() * 256);
|
|
58
|
+
t[6] = t[6] & 15 | 64, t[8] = t[8] & 63 | 128;
|
|
59
|
+
let o = Array.from(t, (i) => i.toString(16).padStart(2, "0")).join("");
|
|
60
|
+
return `${o.slice(0, 8)}-${o.slice(8, 12)}-${o.slice(12, 16)}-${o.slice(16, 20)}-${o.slice(20)}`;
|
|
61
|
+
}
|
|
62
|
+
function N(e, t) {
|
|
63
|
+
let n, o = {};
|
|
64
|
+
for (let [u, r] of Object.entries(e)) {
|
|
65
|
+
if (u.toLowerCase() === A) {
|
|
66
|
+
S(r) && (n = r);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
o[u] = r;
|
|
70
|
+
}
|
|
71
|
+
let i = n ?? (S(t) ? t : void 0) ?? H();
|
|
72
|
+
return o[A] = i, { headers: o, correlationId: i };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/server-only-key.ts
|
|
76
|
+
function x() {
|
|
77
|
+
try {
|
|
78
|
+
let e = globalThis.navigator;
|
|
79
|
+
if (e && e.product === "ReactNative") return "react-native";
|
|
80
|
+
} catch {
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
let e = globalThis;
|
|
84
|
+
if (typeof e.window < "u" && typeof e.document < "u") return "browser";
|
|
85
|
+
} catch {
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
|
|
31
90
|
// src/http.ts
|
|
32
|
-
var
|
|
91
|
+
var F = {
|
|
33
92
|
// SDK major 3.x requer Core ≥ 2026.05.1 (suporte a X-Neetru-Version header,
|
|
34
93
|
// runTransaction write-after-read, verifyWebhookRequest, webhooks 3.0+)
|
|
35
94
|
3: "2026.05.1"
|
|
36
95
|
};
|
|
37
|
-
function
|
|
96
|
+
function R(e) {
|
|
38
97
|
return e.split("+")[0] ?? e;
|
|
39
98
|
}
|
|
40
|
-
function
|
|
41
|
-
let n =
|
|
42
|
-
for (let
|
|
43
|
-
let
|
|
44
|
-
if (
|
|
99
|
+
function V(e, t) {
|
|
100
|
+
let n = R(e).split(".").map(Number), o = R(t).split(".").map(Number), i = Math.max(n.length, o.length);
|
|
101
|
+
for (let u = 0; u < i; u++) {
|
|
102
|
+
let r = n[u] ?? 0, a = o[u] ?? 0;
|
|
103
|
+
if (r !== a) return r - a;
|
|
45
104
|
}
|
|
46
105
|
return 0;
|
|
47
106
|
}
|
|
48
|
-
function
|
|
107
|
+
function L() {
|
|
49
108
|
try {
|
|
50
|
-
return "3.
|
|
109
|
+
return "3.8.1";
|
|
51
110
|
} catch {
|
|
52
111
|
return;
|
|
53
112
|
}
|
|
54
113
|
}
|
|
55
|
-
function
|
|
56
|
-
let e =
|
|
114
|
+
function B() {
|
|
115
|
+
let e = L();
|
|
57
116
|
return e ? parseInt(e.split(".")[0] ?? "3", 10) : 3;
|
|
58
117
|
}
|
|
59
|
-
var
|
|
60
|
-
function
|
|
118
|
+
var D = /* @__PURE__ */ new Set();
|
|
119
|
+
function z(e) {
|
|
61
120
|
if (!e) return;
|
|
62
|
-
let
|
|
121
|
+
let t = B(), n = F[t];
|
|
63
122
|
if (!n) return;
|
|
64
|
-
let
|
|
65
|
-
if (
|
|
66
|
-
let
|
|
67
|
-
|
|
68
|
-
`[Neetru SDK] Aten\xE7\xE3o: Core vers\xE3o "${e}" \xE9 anterior ao m\xEDnimo recomendado "${n}" para SDK major ${
|
|
123
|
+
let o = R(e);
|
|
124
|
+
if (V(o, n) < 0) {
|
|
125
|
+
let i = `${t}:${o}`;
|
|
126
|
+
D.has(i) || (D.add(i), console.warn(
|
|
127
|
+
`[Neetru SDK] Aten\xE7\xE3o: Core vers\xE3o "${e}" \xE9 anterior ao m\xEDnimo recomendado "${n}" para SDK major ${t}. Alguns recursos podem n\xE3o funcionar corretamente. Atualize o Core para a vers\xE3o mais recente.`
|
|
69
128
|
));
|
|
70
129
|
}
|
|
71
130
|
}
|
|
72
|
-
|
|
131
|
+
function G() {
|
|
132
|
+
let e = "This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.";
|
|
133
|
+
return x() ? "Esta opera\xE7\xE3o exige a credencial nrt_ do produto, que \xE9 S\xD3 DE SERVIDOR. No navegador/app, chame a API do seu produto (ex.: https://<produto>.neetru.com/api/v1) com o token do usu\xE1rio \u2014 o backend do produto faz esta chamada com o SDK e a chave. (" + e + ")" : e;
|
|
134
|
+
}
|
|
135
|
+
var X = 2, Y = 0, J = /* @__PURE__ */ new Set(["GET", "HEAD"]), W = /* @__PURE__ */ new Set([
|
|
73
136
|
"rate_limited",
|
|
74
137
|
"server_error",
|
|
75
138
|
"network_error"
|
|
76
139
|
]);
|
|
77
|
-
function
|
|
78
|
-
let
|
|
79
|
-
return Math.max(50, Math.round(
|
|
140
|
+
function C(e) {
|
|
141
|
+
let t = 200 * Math.pow(4, e), n = t * 0.2 * (Math.random() * 2 - 1);
|
|
142
|
+
return Math.max(50, Math.round(t + n));
|
|
80
143
|
}
|
|
81
|
-
var
|
|
82
|
-
function
|
|
144
|
+
var O = 6e4;
|
|
145
|
+
function Q(e) {
|
|
83
146
|
if (!e) return null;
|
|
84
|
-
let
|
|
85
|
-
if (Number.isFinite(
|
|
147
|
+
let t = Number(e);
|
|
148
|
+
if (Number.isFinite(t) && t >= 0) return Math.min(Math.round(t * 1e3), O);
|
|
86
149
|
let n = Date.parse(e);
|
|
87
150
|
if (Number.isFinite(n)) {
|
|
88
|
-
let
|
|
89
|
-
if (
|
|
151
|
+
let o = n - Date.now();
|
|
152
|
+
if (o > 0) return Math.min(o, O);
|
|
90
153
|
}
|
|
91
154
|
return null;
|
|
92
155
|
}
|
|
93
156
|
function q(e) {
|
|
94
|
-
return new Promise((
|
|
157
|
+
return new Promise((t) => setTimeout(t, e));
|
|
95
158
|
}
|
|
96
|
-
function
|
|
159
|
+
function Z(e) {
|
|
97
160
|
return e === 401 ? "unauthorized" : e === 403 ? "forbidden" : e === 404 ? "not_found" : e === 409 ? "conflict" : e === 410 ? "gone" : e === 422 || e === 400 ? "validation_failed" : e === 429 ? "rate_limited" : e >= 500 ? "server_error" : "unknown";
|
|
98
161
|
}
|
|
99
|
-
function
|
|
100
|
-
let
|
|
162
|
+
function ee(e, t, n) {
|
|
163
|
+
let o = e.replace(/\/+$/, ""), i = t.startsWith("/") ? t : `/${t}`, u = new URL(`${o}${i}`);
|
|
101
164
|
if (n)
|
|
102
|
-
for (let [
|
|
103
|
-
|
|
104
|
-
return
|
|
165
|
+
for (let [r, a] of Object.entries(n))
|
|
166
|
+
a !== void 0 && u.searchParams.set(r, String(a));
|
|
167
|
+
return u.toString();
|
|
105
168
|
}
|
|
106
|
-
async function
|
|
107
|
-
let
|
|
108
|
-
if (
|
|
169
|
+
async function K(e) {
|
|
170
|
+
let t = await e.text();
|
|
171
|
+
if (t)
|
|
109
172
|
try {
|
|
110
|
-
return JSON.parse(
|
|
173
|
+
return JSON.parse(t);
|
|
111
174
|
} catch {
|
|
112
175
|
return;
|
|
113
176
|
}
|
|
114
177
|
}
|
|
115
|
-
async function
|
|
116
|
-
let n =
|
|
117
|
-
accept: "application/json",
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
if (
|
|
178
|
+
async function v(e, t) {
|
|
179
|
+
let n = t.method ?? "GET", o = ee(e.baseUrl, t.path, t.query), i = J.has(n) ? X : Y, u = t.retries ?? i, { headers: r, correlationId: a } = N(
|
|
180
|
+
{ accept: "application/json", ...t.headers },
|
|
181
|
+
t.correlationId
|
|
182
|
+
), l = L();
|
|
183
|
+
if (l && (r["x-neetru-sdk-version"] = l), t.requireAuth) {
|
|
121
184
|
if (!e.apiKey)
|
|
122
|
-
throw new
|
|
123
|
-
|
|
124
|
-
"This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var."
|
|
125
|
-
);
|
|
126
|
-
t.authorization = `Bearer ${e.apiKey}`;
|
|
185
|
+
throw new d("missing_api_key", G());
|
|
186
|
+
r.authorization = `Bearer ${e.apiKey}`;
|
|
127
187
|
}
|
|
128
|
-
if (
|
|
129
|
-
let
|
|
130
|
-
|
|
188
|
+
if (t.idempotencyKey) {
|
|
189
|
+
let g = typeof t.idempotencyKey == "string" ? t.idempotencyKey : I();
|
|
190
|
+
r["idempotency-key"] = g;
|
|
131
191
|
}
|
|
132
|
-
let
|
|
133
|
-
|
|
134
|
-
let
|
|
135
|
-
for (let
|
|
136
|
-
if (
|
|
137
|
-
throw
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
192
|
+
let c = t.body !== void 0 && n !== "GET" && n !== "DELETE" ? JSON.stringify(t.body) : void 0;
|
|
193
|
+
c !== void 0 && (r["content-type"] = "application/json");
|
|
194
|
+
let f = null, m = t.deadlineMs != null ? Date.now() + t.deadlineMs : null;
|
|
195
|
+
for (let g = 0; g <= u; g++) {
|
|
196
|
+
if (m != null && Date.now() >= m)
|
|
197
|
+
throw f ?? new d(
|
|
198
|
+
"network_error",
|
|
199
|
+
"Deadline excedido antes de completar a request",
|
|
200
|
+
void 0,
|
|
201
|
+
void 0,
|
|
202
|
+
void 0,
|
|
203
|
+
a
|
|
204
|
+
);
|
|
205
|
+
let b = { method: n, headers: r };
|
|
206
|
+
c !== void 0 && (b.body = c);
|
|
207
|
+
let U = m != null ? Math.max(1, Math.min(3e4, m - Date.now())) : 3e4;
|
|
208
|
+
b.signal = AbortSignal.timeout(U);
|
|
142
209
|
let p;
|
|
143
210
|
try {
|
|
144
|
-
p = await e.fetch(
|
|
145
|
-
} catch (
|
|
146
|
-
let
|
|
147
|
-
if (
|
|
148
|
-
let k =
|
|
149
|
-
if (
|
|
211
|
+
p = await e.fetch(o, b);
|
|
212
|
+
} catch (s) {
|
|
213
|
+
let _ = s instanceof DOMException && s.name === "TimeoutError" ? "Network error: timeout after 30s" : `Network error: ${s instanceof Error ? s.message : "fetch failed"}`;
|
|
214
|
+
if (f = new d("network_error", _, void 0, void 0, void 0, a), g < u) {
|
|
215
|
+
let k = C(g);
|
|
216
|
+
if (m == null || Date.now() + k < m) {
|
|
150
217
|
await q(k);
|
|
151
218
|
continue;
|
|
152
219
|
}
|
|
153
220
|
}
|
|
154
|
-
throw
|
|
221
|
+
throw f;
|
|
155
222
|
}
|
|
156
|
-
let
|
|
223
|
+
let $ = p.headers.get("x-request-id") ?? p.headers.get("x-correlation-id") ?? void 0;
|
|
157
224
|
if (p.ok) {
|
|
158
|
-
let
|
|
159
|
-
return
|
|
225
|
+
let s = p.headers.get("x-neetru-version");
|
|
226
|
+
return s && z(s), await K(p);
|
|
160
227
|
}
|
|
161
|
-
let
|
|
162
|
-
if (
|
|
163
|
-
let
|
|
164
|
-
typeof
|
|
228
|
+
let y = await K(p), w = Z(p.status), h = `HTTP ${p.status}`, E;
|
|
229
|
+
if (y && typeof y == "object") {
|
|
230
|
+
let s = y.error;
|
|
231
|
+
typeof s == "string" ? h = s : s && typeof s == "object" ? (typeof s.code == "string" && (w = s.code), typeof s.message == "string" && (h = s.message), typeof s.reason == "string" && (E = s.reason)) : (typeof y.code == "string" && (w = y.code), typeof y.message == "string" && (h = y.message)), typeof y.reason == "string" && (E = y.reason);
|
|
165
232
|
}
|
|
166
233
|
if (p.status === 410) {
|
|
167
|
-
let
|
|
168
|
-
h === `HTTP ${p.status}` && (h = `Endpoint ${
|
|
234
|
+
let s = p.headers.get("x-neetru-replacement");
|
|
235
|
+
h === `HTTP ${p.status}` && (h = `Endpoint ${t.path} foi removido do Core (HTTP 410 Gone) \u2014 atualize o @neetru/sdk e migre para a API substituta.`), s && !h.includes(s) && (h += ` Substituto: ${s}.`);
|
|
169
236
|
}
|
|
170
|
-
let
|
|
171
|
-
if (
|
|
172
|
-
let
|
|
173
|
-
if (
|
|
174
|
-
await q(
|
|
237
|
+
let T = new d(w, h, p.status, $, E, a);
|
|
238
|
+
if (f = T, W.has(w) && g < u) {
|
|
239
|
+
let _ = Q(p.headers.get("retry-after")) ?? C(g);
|
|
240
|
+
if (m == null || Date.now() + _ < m) {
|
|
241
|
+
await q(_);
|
|
175
242
|
continue;
|
|
176
243
|
}
|
|
177
244
|
}
|
|
178
|
-
throw
|
|
245
|
+
throw T;
|
|
179
246
|
}
|
|
180
|
-
throw
|
|
247
|
+
throw f ?? new d("unknown", "unexpected httpRequest exit", void 0, void 0, void 0, a);
|
|
181
248
|
}
|
|
182
249
|
|
|
183
250
|
// src/telemetry.ts
|
|
184
|
-
var
|
|
185
|
-
function
|
|
251
|
+
var P = ["debug", "info", "warn", "error", "fatal"];
|
|
252
|
+
function te() {
|
|
186
253
|
return typeof globalThis < "u" && typeof globalThis.window < "u";
|
|
187
254
|
}
|
|
188
|
-
function
|
|
189
|
-
return
|
|
255
|
+
function M() {
|
|
256
|
+
return te() ? { path: "/api/sdk/v1/telemetry/event/public", requireAuth: false } : { path: "/api/sdk/v1/telemetry/event", requireAuth: true };
|
|
190
257
|
}
|
|
191
|
-
function
|
|
258
|
+
function re(e) {
|
|
192
259
|
switch (e) {
|
|
193
260
|
case "debug":
|
|
194
261
|
return console.debug.bind(console);
|
|
@@ -204,41 +271,41 @@ function J(e) {
|
|
|
204
271
|
return console.log.bind(console);
|
|
205
272
|
}
|
|
206
273
|
}
|
|
207
|
-
var
|
|
208
|
-
function
|
|
209
|
-
let
|
|
210
|
-
async function
|
|
211
|
-
if (
|
|
212
|
-
let
|
|
213
|
-
|
|
274
|
+
var ne = 500, oe = 50;
|
|
275
|
+
function _e(e) {
|
|
276
|
+
let t = [], n = null, o = null;
|
|
277
|
+
async function i() {
|
|
278
|
+
if (t.length === 0) return;
|
|
279
|
+
let r = t.splice(0, t.length), a = Promise.allSettled(
|
|
280
|
+
r.map(async (l) => {
|
|
214
281
|
try {
|
|
215
|
-
let
|
|
216
|
-
|
|
217
|
-
let
|
|
218
|
-
await
|
|
282
|
+
let c = { name: l.name }, f = l.productSlug ?? e.productId;
|
|
283
|
+
f && (c.productSlug = f), l.properties && typeof l.properties == "object" && (c.properties = l.properties), l.timestamp && (c.timestamp = l.timestamp);
|
|
284
|
+
let m = M();
|
|
285
|
+
await v(e, {
|
|
219
286
|
method: "POST",
|
|
220
|
-
path:
|
|
221
|
-
body:
|
|
222
|
-
requireAuth:
|
|
287
|
+
path: m.path,
|
|
288
|
+
body: c,
|
|
289
|
+
requireAuth: m.requireAuth,
|
|
223
290
|
retries: 1,
|
|
224
291
|
// caça-bruxas: retry sem Idempotency-Key duplicava o evento se o
|
|
225
292
|
// servidor já tinha persistido antes da falha transiente. Mesmo
|
|
226
293
|
// padrão do usage.report (key estável por chamada, reusada no retry).
|
|
227
294
|
idempotencyKey: !0
|
|
228
295
|
});
|
|
229
|
-
} catch (
|
|
230
|
-
typeof console < "u" && console.warn("[neetru-sdk] telemetry.track flush failed for event", l.name,
|
|
296
|
+
} catch (c) {
|
|
297
|
+
typeof console < "u" && console.warn("[neetru-sdk] telemetry.track flush failed for event", l.name, c);
|
|
231
298
|
}
|
|
232
299
|
})
|
|
233
300
|
);
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}), await
|
|
301
|
+
o = a.then(() => {
|
|
302
|
+
o = null;
|
|
303
|
+
}), await a, n = null, t.length > 0 && u();
|
|
237
304
|
}
|
|
238
|
-
function
|
|
305
|
+
function u() {
|
|
239
306
|
n || (n = setTimeout(() => {
|
|
240
|
-
|
|
241
|
-
},
|
|
307
|
+
i();
|
|
308
|
+
}, ne));
|
|
242
309
|
}
|
|
243
310
|
return {
|
|
244
311
|
/**
|
|
@@ -253,24 +320,24 @@ function se(e) {
|
|
|
253
320
|
* });
|
|
254
321
|
* ```
|
|
255
322
|
*/
|
|
256
|
-
async event(
|
|
257
|
-
if (!
|
|
258
|
-
throw new
|
|
259
|
-
if (typeof
|
|
260
|
-
throw new
|
|
261
|
-
if (
|
|
262
|
-
throw new
|
|
263
|
-
let
|
|
264
|
-
l && (
|
|
265
|
-
let
|
|
323
|
+
async event(r) {
|
|
324
|
+
if (!r || typeof r != "object")
|
|
325
|
+
throw new d("validation_failed", "event input is required");
|
|
326
|
+
if (typeof r.name != "string" || r.name.length === 0)
|
|
327
|
+
throw new d("validation_failed", "event.name is required");
|
|
328
|
+
if (r.name.length > 128)
|
|
329
|
+
throw new d("validation_failed", "event.name max 128 chars");
|
|
330
|
+
let a = { name: r.name }, l = r.productSlug ?? e.productId;
|
|
331
|
+
l && (a.productSlug = l), r.properties && typeof r.properties == "object" && (a.properties = r.properties), r.timestamp && (a.timestamp = r.timestamp);
|
|
332
|
+
let c = M(), f = await v(e, {
|
|
266
333
|
method: "POST",
|
|
267
|
-
path:
|
|
268
|
-
body:
|
|
269
|
-
requireAuth:
|
|
334
|
+
path: c.path,
|
|
335
|
+
body: a,
|
|
336
|
+
requireAuth: c.requireAuth
|
|
270
337
|
});
|
|
271
|
-
if (!
|
|
272
|
-
throw new
|
|
273
|
-
return { ok: true, eventId:
|
|
338
|
+
if (!f || f.ok !== true || typeof f.eventId != "string")
|
|
339
|
+
throw new d("invalid_response", "Telemetry response missing eventId");
|
|
340
|
+
return { ok: true, eventId: f.eventId };
|
|
274
341
|
},
|
|
275
342
|
/**
|
|
276
343
|
* Fire-and-forget: enqueue + flush 500ms debounce. Não retorna `eventId`
|
|
@@ -282,15 +349,15 @@ function se(e) {
|
|
|
282
349
|
* // segue execução; flush async em background
|
|
283
350
|
* ```
|
|
284
351
|
*/
|
|
285
|
-
track(
|
|
286
|
-
!
|
|
352
|
+
track(r) {
|
|
353
|
+
!r || typeof r != "object" || typeof r.name != "string" || r.name.length === 0 || r.name.length > 128 || (t.push(r), t.length >= oe ? (n && (clearTimeout(n), n = null), i()) : u());
|
|
287
354
|
},
|
|
288
355
|
/**
|
|
289
356
|
* Força flush imediato da queue de `track()`. Resolva antes de
|
|
290
357
|
* page unload / SSR boundary pra não perder eventos.
|
|
291
358
|
*/
|
|
292
359
|
async flush() {
|
|
293
|
-
n && (clearTimeout(n), n = null),
|
|
360
|
+
n && (clearTimeout(n), n = null), o && await o, await i();
|
|
294
361
|
},
|
|
295
362
|
/**
|
|
296
363
|
* Registra um log estruturado per-product (Sprint 6).
|
|
@@ -307,49 +374,49 @@ function se(e) {
|
|
|
307
374
|
* });
|
|
308
375
|
* ```
|
|
309
376
|
*/
|
|
310
|
-
async log(
|
|
311
|
-
if (!
|
|
312
|
-
throw new
|
|
313
|
-
if (!
|
|
314
|
-
throw new
|
|
315
|
-
if (typeof
|
|
316
|
-
throw new
|
|
317
|
-
if (
|
|
318
|
-
throw new
|
|
377
|
+
async log(r) {
|
|
378
|
+
if (!r || typeof r != "object")
|
|
379
|
+
throw new d("validation_failed", "log input is required");
|
|
380
|
+
if (!P.includes(r.level))
|
|
381
|
+
throw new d("validation_failed", `level must be one of ${P.join(", ")}`);
|
|
382
|
+
if (typeof r.message != "string" || r.message.length === 0)
|
|
383
|
+
throw new d("validation_failed", "message is required");
|
|
384
|
+
if (r.message.length > 4e3)
|
|
385
|
+
throw new d("validation_failed", "message max 4000 chars");
|
|
319
386
|
if (e.env === "dev")
|
|
320
|
-
return
|
|
321
|
-
let
|
|
322
|
-
level:
|
|
323
|
-
message:
|
|
387
|
+
return re(r.level)(`[neetru-sdk] ${r.level}: ${r.message}`, r.metadata ?? {}), { ok: true, mode: "mock" };
|
|
388
|
+
let a = {
|
|
389
|
+
level: r.level,
|
|
390
|
+
message: r.message
|
|
324
391
|
};
|
|
325
|
-
|
|
326
|
-
let l =
|
|
327
|
-
l && (
|
|
328
|
-
let
|
|
329
|
-
if (!
|
|
392
|
+
r.metadata && (a.metadata = r.metadata);
|
|
393
|
+
let l = r.productSlug ?? e.productId;
|
|
394
|
+
l && (a.productSlug = l);
|
|
395
|
+
let c = r.correlationId;
|
|
396
|
+
if (!c)
|
|
330
397
|
try {
|
|
331
|
-
let
|
|
332
|
-
typeof
|
|
398
|
+
let g = globalThis.NEETRU_CORRELATION_ID;
|
|
399
|
+
typeof g == "string" && g.length > 0 && (c = g);
|
|
333
400
|
} catch {
|
|
334
401
|
}
|
|
335
|
-
let
|
|
336
|
-
|
|
337
|
-
let
|
|
402
|
+
let f = {};
|
|
403
|
+
c && (f["x-correlation-id"] = c);
|
|
404
|
+
let m = await v(e, {
|
|
338
405
|
method: "POST",
|
|
339
406
|
path: "/api/sdk/v1/telemetry/log",
|
|
340
|
-
body:
|
|
407
|
+
body: a,
|
|
341
408
|
requireAuth: true,
|
|
342
|
-
headers:
|
|
409
|
+
headers: f
|
|
343
410
|
});
|
|
344
|
-
if (!
|
|
345
|
-
throw new
|
|
411
|
+
if (!m || m.ok !== true)
|
|
412
|
+
throw new d("invalid_response", "Telemetry log response missing ok");
|
|
346
413
|
return {
|
|
347
414
|
ok: true,
|
|
348
|
-
logId: typeof
|
|
415
|
+
logId: typeof m.logId == "string" ? m.logId : void 0,
|
|
349
416
|
mode: "http"
|
|
350
417
|
};
|
|
351
418
|
}
|
|
352
419
|
};
|
|
353
420
|
}
|
|
354
421
|
|
|
355
|
-
export {
|
|
422
|
+
export { _e as createTelemetryNamespace };
|