@neetru/sdk 3.8.0 → 3.9.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/CHANGELOG.md +53 -0
- package/README.md +4 -1
- package/dist/ai.cjs +1 -1
- package/dist/ai.d.cts +1 -1
- package/dist/ai.d.ts +1 -1
- package/dist/ai.mjs +1 -1
- package/dist/auth.cjs +1171 -1110
- package/dist/auth.d.cts +1 -1
- package/dist/auth.d.ts +1 -1
- package/dist/auth.mjs +1168 -1107
- package/dist/catalog.cjs +1 -1
- package/dist/catalog.d.cts +1 -1
- package/dist/catalog.d.ts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/checkout.cjs +62 -49
- package/dist/checkout.d.cts +1 -1
- package/dist/checkout.d.ts +1 -1
- package/dist/checkout.mjs +62 -49
- package/dist/db-react.d.cts +1 -1
- package/dist/db-react.d.ts +1 -1
- package/dist/db.cjs +303 -270
- package/dist/db.d.cts +1 -1
- package/dist/db.d.ts +1 -1
- package/dist/db.mjs +322 -289
- package/dist/entitlements.d.cts +1 -1
- package/dist/entitlements.d.ts +1 -1
- package/dist/firestore-compat.d.cts +1 -1
- package/dist/firestore-compat.d.ts +1 -1
- package/dist/index.cjs +1275 -1214
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +1390 -1329
- package/dist/mobile.cjs +328 -276
- package/dist/mobile.d.cts +12 -2
- package/dist/mobile.d.ts +12 -2
- package/dist/mobile.mjs +328 -276
- package/dist/mocks.cjs +5 -5
- package/dist/mocks.d.cts +2 -2
- package/dist/mocks.d.ts +2 -2
- package/dist/mocks.mjs +4 -4
- package/dist/notifications.cjs +1 -1
- package/dist/notifications.d.cts +1 -1
- package/dist/notifications.d.ts +1 -1
- package/dist/notifications.mjs +1 -1
- package/dist/react.cjs +119 -119
- package/dist/react.d.cts +8 -2
- package/dist/react.d.ts +8 -2
- package/dist/react.mjs +119 -119
- package/dist/support.cjs +1 -1
- package/dist/support.d.cts +1 -1
- package/dist/support.d.ts +1 -1
- package/dist/support.mjs +1 -1
- package/dist/telemetry.cjs +62 -49
- package/dist/telemetry.d.cts +1 -1
- package/dist/telemetry.d.ts +1 -1
- package/dist/telemetry.mjs +62 -49
- package/dist/{types-D-9bjlM0.d.cts → types-Bl_4HROd.d.cts} +118 -19
- package/dist/{types-bVztFQTI.d.ts → types-Bqnsqvow.d.ts} +118 -19
- package/dist/usage.cjs +1 -1
- package/dist/usage.d.cts +1 -1
- package/dist/usage.d.ts +1 -1
- package/dist/usage.mjs +1 -1
- package/dist/webhooks.cjs +1 -1
- package/dist/webhooks.d.cts +1 -1
- package/dist/webhooks.d.ts +1 -1
- package/dist/webhooks.mjs +1 -1
- package/package.json +9 -1
package/dist/db.cjs
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
var idb = require('idb');
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var Ze = Object.defineProperty;
|
|
6
6
|
var S = (r, e) => () => (r && (e = r(r = 0)), e);
|
|
7
7
|
var me = (r, e) => {
|
|
8
8
|
for (var t in e)
|
|
9
|
-
|
|
9
|
+
Ze(r, t, { get: e[t], enumerable: true });
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
// src/errors.ts
|
|
13
|
-
var
|
|
14
|
-
|
|
13
|
+
var b, x = S(() => {
|
|
14
|
+
b = class r extends Error {
|
|
15
15
|
code;
|
|
16
16
|
status;
|
|
17
17
|
requestId;
|
|
@@ -38,13 +38,13 @@ var g, x = S(() => {
|
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
// src/db-errors.ts
|
|
41
|
-
var
|
|
41
|
+
var et; exports.NeetruDbError = void 0; var I = S(() => {
|
|
42
42
|
x();
|
|
43
|
-
|
|
43
|
+
et = /* @__PURE__ */ new Set([
|
|
44
44
|
"db_unavailable",
|
|
45
45
|
"db_conflict",
|
|
46
46
|
"db_timeout"
|
|
47
|
-
]), exports.NeetruDbError = class r extends
|
|
47
|
+
]), exports.NeetruDbError = class r extends b {
|
|
48
48
|
/** Código de erro fechado — específico de DB. */
|
|
49
49
|
code;
|
|
50
50
|
/**
|
|
@@ -58,30 +58,30 @@ var Ye; exports.NeetruDbError = void 0; var I = S(() => {
|
|
|
58
58
|
*/
|
|
59
59
|
dbId;
|
|
60
60
|
constructor(e, t, n) {
|
|
61
|
-
super(e, t), this.name = "NeetruDbError", this.code = e, this.retryable =
|
|
61
|
+
super(e, t), this.name = "NeetruDbError", this.code = e, this.retryable = et.has(e), this.dbId = n, Object.setPrototypeOf(this, r.prototype);
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
64
|
});
|
|
65
65
|
|
|
66
66
|
// src/idempotency.ts
|
|
67
|
-
function
|
|
67
|
+
function Re() {
|
|
68
68
|
let r = typeof globalThis < "u" && "crypto" in globalThis ? globalThis.crypto : void 0;
|
|
69
69
|
if (r && typeof r.randomUUID == "function")
|
|
70
70
|
return r.randomUUID();
|
|
71
|
-
throw new
|
|
71
|
+
throw new b(
|
|
72
72
|
"runtime_unsupported",
|
|
73
73
|
"crypto.randomUUID not available in this runtime. SDK 3.0 requires Node \u226520 or modern browser/Edge."
|
|
74
74
|
);
|
|
75
75
|
}
|
|
76
|
-
var
|
|
76
|
+
var De = S(() => {
|
|
77
77
|
x();
|
|
78
78
|
});
|
|
79
79
|
|
|
80
80
|
// src/correlation.ts
|
|
81
|
-
function
|
|
82
|
-
return typeof r == "string" && r.length > 0 && r.length <= 128 &&
|
|
81
|
+
function Ce(r) {
|
|
82
|
+
return typeof r == "string" && r.length > 0 && r.length <= 128 && Tt.test(r);
|
|
83
83
|
}
|
|
84
|
-
function
|
|
84
|
+
function Rt() {
|
|
85
85
|
let r = globalThis.crypto;
|
|
86
86
|
try {
|
|
87
87
|
if (r && typeof r.randomUUID == "function") return r.randomUUID();
|
|
@@ -99,24 +99,24 @@ function wt() {
|
|
|
99
99
|
let n = Array.from(e, (o) => o.toString(16).padStart(2, "0")).join("");
|
|
100
100
|
return `${n.slice(0, 8)}-${n.slice(8, 12)}-${n.slice(12, 16)}-${n.slice(16, 20)}-${n.slice(20)}`;
|
|
101
101
|
}
|
|
102
|
-
function
|
|
102
|
+
function Ie(r, e) {
|
|
103
103
|
let t, n = {};
|
|
104
104
|
for (let [i, s] of Object.entries(r)) {
|
|
105
|
-
if (i.toLowerCase() ===
|
|
106
|
-
|
|
105
|
+
if (i.toLowerCase() === ke) {
|
|
106
|
+
Ce(s) && (t = s);
|
|
107
107
|
continue;
|
|
108
108
|
}
|
|
109
109
|
n[i] = s;
|
|
110
110
|
}
|
|
111
|
-
let o = t ?? (
|
|
112
|
-
return n[
|
|
111
|
+
let o = t ?? (Ce(e) ? e : void 0) ?? Rt();
|
|
112
|
+
return n[ke] = o, { headers: n, correlationId: o };
|
|
113
113
|
}
|
|
114
|
-
var
|
|
115
|
-
|
|
114
|
+
var ke, Tt, Pe = S(() => {
|
|
115
|
+
ke = "x-correlation-id", Tt = /^[A-Za-z0-9._:\-]+$/;
|
|
116
116
|
});
|
|
117
117
|
|
|
118
118
|
// src/server-only-key.ts
|
|
119
|
-
function
|
|
119
|
+
function Ee() {
|
|
120
120
|
try {
|
|
121
121
|
let r = globalThis.navigator;
|
|
122
122
|
if (r && r.product === "ReactNative") return "react-native";
|
|
@@ -129,20 +129,20 @@ function Pe() {
|
|
|
129
129
|
}
|
|
130
130
|
return null;
|
|
131
131
|
}
|
|
132
|
-
var
|
|
132
|
+
var Le = S(() => {
|
|
133
133
|
});
|
|
134
134
|
|
|
135
135
|
// src/http.ts
|
|
136
136
|
var U = {};
|
|
137
137
|
me(U, {
|
|
138
|
-
checkCoreVersionCompat: () =>
|
|
139
|
-
httpRequest: () =>
|
|
140
|
-
statusToCode: () =>
|
|
138
|
+
checkCoreVersionCompat: () => Fe,
|
|
139
|
+
httpRequest: () => At,
|
|
140
|
+
statusToCode: () => Ue
|
|
141
141
|
});
|
|
142
142
|
function se(r) {
|
|
143
143
|
return r.split("+")[0] ?? r;
|
|
144
144
|
}
|
|
145
|
-
function
|
|
145
|
+
function kt(r, e) {
|
|
146
146
|
let t = se(r).split(".").map(Number), n = se(e).split(".").map(Number), o = Math.max(t.length, n.length);
|
|
147
147
|
for (let i = 0; i < o; i++) {
|
|
148
148
|
let s = t[i] ?? 0, a = n[i] ?? 0;
|
|
@@ -150,62 +150,62 @@ function Tt(r, e) {
|
|
|
150
150
|
}
|
|
151
151
|
return 0;
|
|
152
152
|
}
|
|
153
|
-
function
|
|
153
|
+
function qe() {
|
|
154
154
|
try {
|
|
155
|
-
return "3.
|
|
155
|
+
return "3.9.0";
|
|
156
156
|
} catch {
|
|
157
157
|
return;
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
-
function
|
|
161
|
-
let r =
|
|
160
|
+
function Ct() {
|
|
161
|
+
let r = qe();
|
|
162
162
|
return r ? parseInt(r.split(".")[0] ?? "3", 10) : 3;
|
|
163
163
|
}
|
|
164
|
-
function
|
|
164
|
+
function Fe(r) {
|
|
165
165
|
if (!r) return;
|
|
166
|
-
let e =
|
|
166
|
+
let e = Ct(), t = Dt[e];
|
|
167
167
|
if (!t) return;
|
|
168
168
|
let n = se(r);
|
|
169
|
-
if (
|
|
169
|
+
if (kt(n, t) < 0) {
|
|
170
170
|
let o = `${e}:${n}`;
|
|
171
|
-
|
|
171
|
+
Me.has(o) || (Me.add(o), console.warn(
|
|
172
172
|
`[Neetru SDK] Aten\xE7\xE3o: Core vers\xE3o "${r}" \xE9 anterior ao m\xEDnimo recomendado "${t}" para SDK major ${e}. Alguns recursos podem n\xE3o funcionar corretamente. Atualize o Core para a vers\xE3o mais recente.`
|
|
173
173
|
));
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
|
-
function
|
|
176
|
+
function It() {
|
|
177
177
|
let r = "This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.";
|
|
178
|
-
return
|
|
178
|
+
return Ee() ? "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. (" + r + ")" : r;
|
|
179
179
|
}
|
|
180
|
-
function
|
|
180
|
+
function Oe(r) {
|
|
181
181
|
let e = 200 * Math.pow(4, r), t = e * 0.2 * (Math.random() * 2 - 1);
|
|
182
182
|
return Math.max(50, Math.round(e + t));
|
|
183
183
|
}
|
|
184
|
-
function
|
|
184
|
+
function Ot(r) {
|
|
185
185
|
if (!r) return null;
|
|
186
186
|
let e = Number(r);
|
|
187
|
-
if (Number.isFinite(e) && e >= 0) return Math.min(Math.round(e * 1e3),
|
|
187
|
+
if (Number.isFinite(e) && e >= 0) return Math.min(Math.round(e * 1e3), xe);
|
|
188
188
|
let t = Date.parse(r);
|
|
189
189
|
if (Number.isFinite(t)) {
|
|
190
190
|
let n = t - Date.now();
|
|
191
|
-
if (n > 0) return Math.min(n,
|
|
191
|
+
if (n > 0) return Math.min(n, xe);
|
|
192
192
|
}
|
|
193
193
|
return null;
|
|
194
194
|
}
|
|
195
|
-
function
|
|
195
|
+
function Ae(r) {
|
|
196
196
|
return new Promise((e) => setTimeout(e, r));
|
|
197
197
|
}
|
|
198
|
-
function
|
|
198
|
+
function Ue(r) {
|
|
199
199
|
return r === 401 ? "unauthorized" : r === 403 ? "forbidden" : r === 404 ? "not_found" : r === 409 ? "conflict" : r === 410 ? "gone" : r === 422 || r === 400 ? "validation_failed" : r === 429 ? "rate_limited" : r >= 500 ? "server_error" : "unknown";
|
|
200
200
|
}
|
|
201
|
-
function
|
|
201
|
+
function xt(r, e, t) {
|
|
202
202
|
let n = r.replace(/\/+$/, ""), o = e.startsWith("/") ? e : `/${e}`, i = new URL(`${n}${o}`);
|
|
203
203
|
if (t)
|
|
204
204
|
for (let [s, a] of Object.entries(t))
|
|
205
205
|
a !== void 0 && i.searchParams.set(s, String(a));
|
|
206
206
|
return i.toString();
|
|
207
207
|
}
|
|
208
|
-
async function
|
|
208
|
+
async function Ne(r) {
|
|
209
209
|
let e = await r.text();
|
|
210
210
|
if (e)
|
|
211
211
|
try {
|
|
@@ -214,26 +214,26 @@ async function Ae(r) {
|
|
|
214
214
|
return;
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
|
-
async function
|
|
218
|
-
let t = e.method ?? "GET", n =
|
|
217
|
+
async function At(r, e) {
|
|
218
|
+
let t = e.method ?? "GET", n = xt(r.baseUrl, e.path, e.query), o = Lt.has(t) ? Pt : Et, i = e.retries ?? o, { headers: s, correlationId: a } = Ie(
|
|
219
219
|
{ accept: "application/json", ...e.headers },
|
|
220
220
|
e.correlationId
|
|
221
|
-
), c =
|
|
221
|
+
), c = qe();
|
|
222
222
|
if (c && (s["x-neetru-sdk-version"] = c), e.requireAuth) {
|
|
223
223
|
if (!r.apiKey)
|
|
224
|
-
throw new
|
|
224
|
+
throw new b("missing_api_key", It());
|
|
225
225
|
s.authorization = `Bearer ${r.apiKey}`;
|
|
226
226
|
}
|
|
227
227
|
if (e.idempotencyKey) {
|
|
228
|
-
let
|
|
229
|
-
s["idempotency-key"] =
|
|
228
|
+
let p = typeof e.idempotencyKey == "string" ? e.idempotencyKey : Re();
|
|
229
|
+
s["idempotency-key"] = p;
|
|
230
230
|
}
|
|
231
231
|
let l = e.body !== void 0 && t !== "GET" && t !== "DELETE" ? JSON.stringify(e.body) : void 0;
|
|
232
232
|
l !== void 0 && (s["content-type"] = "application/json");
|
|
233
233
|
let d = null, u = e.deadlineMs != null ? Date.now() + e.deadlineMs : null;
|
|
234
|
-
for (let
|
|
234
|
+
for (let p = 0; p <= i; p++) {
|
|
235
235
|
if (u != null && Date.now() >= u)
|
|
236
|
-
throw d ?? new
|
|
236
|
+
throw d ?? new b(
|
|
237
237
|
"network_error",
|
|
238
238
|
"Deadline excedido antes de completar a request",
|
|
239
239
|
void 0,
|
|
@@ -243,72 +243,72 @@ async function Mt(r, e) {
|
|
|
243
243
|
);
|
|
244
244
|
let h = { method: t, headers: s };
|
|
245
245
|
l !== void 0 && (h.body = l);
|
|
246
|
-
let
|
|
247
|
-
h.signal = AbortSignal.timeout(
|
|
248
|
-
let
|
|
246
|
+
let _ = u != null ? Math.max(1, Math.min(3e4, u - Date.now())) : 3e4;
|
|
247
|
+
h.signal = AbortSignal.timeout(_);
|
|
248
|
+
let y;
|
|
249
249
|
try {
|
|
250
|
-
|
|
250
|
+
y = await r.fetch(n, h);
|
|
251
251
|
} catch (m) {
|
|
252
252
|
let O = m instanceof DOMException && m.name === "TimeoutError" ? "Network error: timeout after 30s" : `Network error: ${m instanceof Error ? m.message : "fetch failed"}`;
|
|
253
|
-
if (d = new
|
|
254
|
-
let he =
|
|
253
|
+
if (d = new b("network_error", O, void 0, void 0, void 0, a), p < i) {
|
|
254
|
+
let he = Oe(p);
|
|
255
255
|
if (u == null || Date.now() + he < u) {
|
|
256
|
-
await
|
|
256
|
+
await Ae(he);
|
|
257
257
|
continue;
|
|
258
258
|
}
|
|
259
259
|
}
|
|
260
260
|
throw d;
|
|
261
261
|
}
|
|
262
|
-
let B =
|
|
263
|
-
if (
|
|
264
|
-
let m =
|
|
265
|
-
return m &&
|
|
262
|
+
let B = y.headers.get("x-request-id") ?? y.headers.get("x-correlation-id") ?? void 0;
|
|
263
|
+
if (y.ok) {
|
|
264
|
+
let m = y.headers.get("x-neetru-version");
|
|
265
|
+
return m && Fe(m), await Ne(y);
|
|
266
266
|
}
|
|
267
|
-
let
|
|
268
|
-
if (
|
|
269
|
-
let m =
|
|
270
|
-
typeof m == "string" ? w = m : m && typeof m == "object" ? (typeof m.code == "string" && (
|
|
267
|
+
let g = await Ne(y), v = Ue(y.status), w = `HTTP ${y.status}`, C;
|
|
268
|
+
if (g && typeof g == "object") {
|
|
269
|
+
let m = g.error;
|
|
270
|
+
typeof m == "string" ? w = m : m && typeof m == "object" ? (typeof m.code == "string" && (v = m.code), typeof m.message == "string" && (w = m.message), typeof m.reason == "string" && (C = m.reason)) : (typeof g.code == "string" && (v = g.code), typeof g.message == "string" && (w = g.message)), typeof g.reason == "string" && (C = g.reason);
|
|
271
271
|
}
|
|
272
|
-
if (
|
|
273
|
-
let m =
|
|
274
|
-
w === `HTTP ${
|
|
272
|
+
if (y.status === 410) {
|
|
273
|
+
let m = y.headers.get("x-neetru-replacement");
|
|
274
|
+
w === `HTTP ${y.status}` && (w = `Endpoint ${e.path} foi removido do Core (HTTP 410 Gone) \u2014 atualize o @neetru/sdk e migre para a API substituta.`), m && !w.includes(m) && (w += ` Substituto: ${m}.`);
|
|
275
275
|
}
|
|
276
|
-
let fe = new
|
|
277
|
-
if (d = fe,
|
|
278
|
-
let O =
|
|
276
|
+
let fe = new b(v, w, y.status, B, C, a);
|
|
277
|
+
if (d = fe, Mt.has(v) && p < i) {
|
|
278
|
+
let O = Ot(y.headers.get("retry-after")) ?? Oe(p);
|
|
279
279
|
if (u == null || Date.now() + O < u) {
|
|
280
|
-
await
|
|
280
|
+
await Ae(O);
|
|
281
281
|
continue;
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
throw fe;
|
|
285
285
|
}
|
|
286
|
-
throw d ?? new
|
|
286
|
+
throw d ?? new b("unknown", "unexpected httpRequest exit", void 0, void 0, void 0, a);
|
|
287
287
|
}
|
|
288
|
-
var
|
|
288
|
+
var Dt, Me, Pt, Et, Lt, Mt, xe, W = S(() => {
|
|
289
289
|
x();
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
290
|
+
De();
|
|
291
|
+
Pe();
|
|
292
|
+
Le();
|
|
293
|
+
Dt = {
|
|
294
294
|
// SDK major 3.x requer Core ≥ 2026.05.1 (suporte a X-Neetru-Version header,
|
|
295
295
|
// runTransaction write-after-read, verifyWebhookRequest, webhooks 3.0+)
|
|
296
296
|
3: "2026.05.1"
|
|
297
297
|
};
|
|
298
|
-
|
|
299
|
-
|
|
298
|
+
Me = /* @__PURE__ */ new Set();
|
|
299
|
+
Pt = 2, Et = 0, Lt = /* @__PURE__ */ new Set(["GET", "HEAD"]), Mt = /* @__PURE__ */ new Set([
|
|
300
300
|
"rate_limited",
|
|
301
301
|
"server_error",
|
|
302
302
|
"network_error"
|
|
303
303
|
]);
|
|
304
|
-
|
|
304
|
+
xe = 6e4;
|
|
305
305
|
});
|
|
306
306
|
|
|
307
307
|
// src/db/sql/resilient-pool.ts
|
|
308
308
|
function J(r) {
|
|
309
309
|
return typeof r == "object" && r !== null && r[ae] === true;
|
|
310
310
|
}
|
|
311
|
-
function
|
|
311
|
+
function Nt(r) {
|
|
312
312
|
let e = r && typeof r == "object" && "code" in r ? r.code : void 0;
|
|
313
313
|
if (e === "ECONNREFUSED" || e === "ETIMEDOUT" || e === "ENOTFOUND" || e === "EHOSTUNREACH" || e === "EAI_AGAIN")
|
|
314
314
|
return true;
|
|
@@ -320,56 +320,73 @@ function Ot(r) {
|
|
|
320
320
|
let n = (r instanceof Error ? r.message : typeof r == "string" ? r : "").toLowerCase();
|
|
321
321
|
return n.length === 0 ? false : !!(n.includes("certificate expired") || n.includes("certificate has expired") || n.includes("cert_has_expired") || n.includes("alert certificate expired") || n.includes("err_ssl") || n.includes("sslv3 alert") || n.includes("tlsv1 alert") || n.includes("econnrefused") || n.includes("etimedout") || n.includes("enotfound") || n.includes("ehostunreach") || n.includes("getaddrinfo"));
|
|
322
322
|
}
|
|
323
|
+
function We(r) {
|
|
324
|
+
let e = r && typeof r == "object" && "code" in r ? r.code : void 0;
|
|
325
|
+
if (typeof e == "string" && qt.has(e.toUpperCase()))
|
|
326
|
+
return true;
|
|
327
|
+
let n = (r instanceof Error ? r.message : typeof r == "string" ? r : "").toLowerCase();
|
|
328
|
+
return n.length === 0 ? false : n.includes("password authentication failed") || n.includes("sasl authentication failed");
|
|
329
|
+
}
|
|
330
|
+
function Ft(r) {
|
|
331
|
+
return Nt(r) || We(r);
|
|
332
|
+
}
|
|
323
333
|
function ce(r) {
|
|
324
334
|
let e = { current: r }, t = null, n = {
|
|
325
|
-
__neetruSwapInner(
|
|
326
|
-
let
|
|
327
|
-
return e.current =
|
|
335
|
+
__neetruSwapInner(d) {
|
|
336
|
+
let u = e.current;
|
|
337
|
+
return e.current = d, u;
|
|
328
338
|
},
|
|
329
339
|
__neetruGetInner() {
|
|
330
340
|
return e.current;
|
|
331
341
|
},
|
|
332
|
-
__neetruSetReLease(
|
|
333
|
-
t =
|
|
342
|
+
__neetruSetReLease(d) {
|
|
343
|
+
t = d;
|
|
334
344
|
}
|
|
335
|
-
}, o = (
|
|
345
|
+
}, o = (d, u, p) => u[d](
|
|
346
|
+
...p
|
|
347
|
+
), i = (d, u) => (...p) => p.length > 0 && typeof p[p.length - 1] == "function" ? o(d, e.current, p) : (async () => {
|
|
336
348
|
try {
|
|
337
|
-
return await o(e.current,
|
|
338
|
-
} catch (
|
|
339
|
-
let
|
|
340
|
-
if (
|
|
341
|
-
throw
|
|
349
|
+
return await o(d, e.current, p);
|
|
350
|
+
} catch (h) {
|
|
351
|
+
let _ = t;
|
|
352
|
+
if (_ === null || !u(h))
|
|
353
|
+
throw h;
|
|
342
354
|
try {
|
|
343
|
-
await
|
|
355
|
+
await _();
|
|
344
356
|
} catch {
|
|
345
|
-
throw
|
|
357
|
+
throw h;
|
|
346
358
|
}
|
|
347
|
-
return await o(e.current,
|
|
359
|
+
return await o(d, e.current, p);
|
|
348
360
|
}
|
|
349
|
-
})(), s = Object.create(Object.getPrototypeOf(r));
|
|
350
|
-
return new Proxy(
|
|
351
|
-
get(
|
|
352
|
-
if (
|
|
353
|
-
if (
|
|
354
|
-
if (
|
|
355
|
-
if (
|
|
356
|
-
if (
|
|
357
|
-
if (
|
|
361
|
+
})(), s = i("query", Ft), a = i("connect", We), c = Object.create(Object.getPrototypeOf(r));
|
|
362
|
+
return new Proxy(c, {
|
|
363
|
+
get(d, u) {
|
|
364
|
+
if (u === ae) return true;
|
|
365
|
+
if (u === "__neetruSwapInner") return n.__neetruSwapInner;
|
|
366
|
+
if (u === "__neetruGetInner") return n.__neetruGetInner;
|
|
367
|
+
if (u === "__neetruSetReLease") return n.__neetruSetReLease;
|
|
368
|
+
if (u === "query") return s;
|
|
369
|
+
if (u === "connect") {
|
|
370
|
+
let _ = e.current;
|
|
371
|
+
return typeof _.connect == "function" ? a : _.connect;
|
|
372
|
+
}
|
|
373
|
+
if (u === "constructor")
|
|
358
374
|
return e.current.constructor;
|
|
359
|
-
let
|
|
360
|
-
return typeof
|
|
375
|
+
let p = e.current, h = Reflect.get(p, u, p);
|
|
376
|
+
return typeof h == "function" ? h.bind(p) : h;
|
|
361
377
|
}
|
|
362
378
|
});
|
|
363
379
|
}
|
|
364
|
-
var ae, le = S(() => {
|
|
380
|
+
var ae, qt, le = S(() => {
|
|
365
381
|
ae = /* @__PURE__ */ Symbol.for("neetru.sdk.resilientPool");
|
|
382
|
+
qt = /* @__PURE__ */ new Set(["28P01", "28000"]);
|
|
366
383
|
});
|
|
367
384
|
|
|
368
385
|
// src/db/sql/lease.ts
|
|
369
|
-
function
|
|
386
|
+
function Wt(r, e) {
|
|
370
387
|
return r ? r.leaseId !== e.leaseId || r.credentialVersion !== e.credentialVersion || r.host !== e.host || r.port !== e.port || r.dbName !== e.dbName || r.user !== e.user || r.password !== e.password || r.sslca !== e.sslca || r.clientCert !== e.clientCert || r.clientKey !== e.clientKey : true;
|
|
371
388
|
}
|
|
372
|
-
function
|
|
389
|
+
function $t(r) {
|
|
373
390
|
if (r instanceof exports.NeetruDbError) return r;
|
|
374
391
|
let e = r instanceof Error ? r.message : String(r), t = r instanceof Error ? r.code : void 0;
|
|
375
392
|
return typeof t == "string" && (t === "ECONNREFUSED" || t === "ENOTFOUND" || t === "ETIMEDOUT") ? new exports.NeetruDbError(
|
|
@@ -377,10 +394,10 @@ function Nt(r) {
|
|
|
377
394
|
`Pool connection failed (${t}): ${e}`
|
|
378
395
|
) : e.includes("statement timeout") || e.includes("lock timeout") ? new exports.NeetruDbError("db_timeout", `Query timeout: ${e}`) : e.includes("40001") || e.includes("40P01") || e.includes("deadlock") ? new exports.NeetruDbError("db_conflict", `Transaction conflict: ${e}`) : e.includes("42501") || e.toLowerCase().includes("permission denied") ? new exports.NeetruDbError("db_permission_denied", `Permission denied: ${e}`) : new exports.NeetruDbError("db_unavailable", `Database error: ${e}`);
|
|
379
396
|
}
|
|
380
|
-
var
|
|
397
|
+
var Ut, M, $, $e = S(() => {
|
|
381
398
|
I();
|
|
382
399
|
le();
|
|
383
|
-
|
|
400
|
+
Ut = 0.8, M = 3e4, $ = class {
|
|
384
401
|
/**
|
|
385
402
|
* Lease atual. `null` no modo LAZY antes da 1ª query (o 1º lease é adiado —
|
|
386
403
|
* ver `_ensureInitialLease`). Após a 1ª aquisição, sempre não-nulo.
|
|
@@ -420,7 +437,7 @@ var xt, M, $, Ue = S(() => {
|
|
|
420
437
|
isolationLevel: t.isolationLevel
|
|
421
438
|
}) : await this._orm.transaction(e);
|
|
422
439
|
} catch (n) {
|
|
423
|
-
throw
|
|
440
|
+
throw $t(n);
|
|
424
441
|
}
|
|
425
442
|
}
|
|
426
443
|
async close() {
|
|
@@ -443,7 +460,7 @@ var xt, M, $, Ue = S(() => {
|
|
|
443
460
|
if (!Number.isFinite(e)) return M;
|
|
444
461
|
let t = this._deps.now(), n = e - t;
|
|
445
462
|
if (n <= 0) return M;
|
|
446
|
-
let o = n * (1 -
|
|
463
|
+
let o = n * (1 - Ut);
|
|
447
464
|
return Math.max(M, Math.round(o));
|
|
448
465
|
}
|
|
449
466
|
_scheduleRenewal() {
|
|
@@ -472,7 +489,7 @@ var xt, M, $, Ue = S(() => {
|
|
|
472
489
|
this._renewalTimer = setTimeout(() => {
|
|
473
490
|
this._doRenew();
|
|
474
491
|
}, M), console.warn(
|
|
475
|
-
`[SqlLeaseManager] renova\xE7\xE3o E emiss\xE3o de lease novo falharam; re-tentando em ${M}ms (cert
|
|
492
|
+
`[SqlLeaseManager] renova\xE7\xE3o E emiss\xE3o de lease novo falharam; re-tentando em ${M}ms (o cert de cliente mTLS do lease expira ~15min ap\xF3s o \xFAltimo swap):`,
|
|
476
493
|
t instanceof Error ? t.message : t
|
|
477
494
|
);
|
|
478
495
|
return;
|
|
@@ -484,10 +501,13 @@ var xt, M, $, Ue = S(() => {
|
|
|
484
501
|
/**
|
|
485
502
|
* Recuperação REATIVA: chamado pelo wrapper resiliente (`resilient-pool.ts`)
|
|
486
503
|
* quando uma query plana falha num erro de ESTABELECIMENTO de conexão (cert
|
|
487
|
-
* TLS
|
|
488
|
-
* renovação que não disparou)
|
|
489
|
-
* do
|
|
490
|
-
*
|
|
504
|
+
* TLS de cliente mTLS do lease expirado no meio de uma request, ou timer de
|
|
505
|
+
* renovação que não disparou) ou de AUTENTICAÇÃO (senha rotacionada por
|
|
506
|
+
* `rotate-credentials` antes do próximo renew — SQLSTATE 28P01/28000, ou o
|
|
507
|
+
* 08P01+SASL do PgBouncer; também no `connect()` de uma transação). Emite um
|
|
508
|
+
* lease NOVO e faz o swap do pool interno do wrapper com a credencial e o
|
|
509
|
+
* certificado frescos (o pool velho é drenado com `end()`); o wrapper então
|
|
510
|
+
* re-tenta a operação 1x no pool novo.
|
|
491
511
|
*
|
|
492
512
|
* Vai DIRETO ao lease novo (sem `leaseId`) — a conexão falhou porque o
|
|
493
513
|
* certificado do lease atual está ruim, então `renew` (que depende do lease
|
|
@@ -579,7 +599,7 @@ var xt, M, $, Ue = S(() => {
|
|
|
579
599
|
* Exposto como método protegido para testes.
|
|
580
600
|
*/
|
|
581
601
|
async _swapPool(e) {
|
|
582
|
-
if (!
|
|
602
|
+
if (!Wt(this._lease, e)) {
|
|
583
603
|
this._lease = e;
|
|
584
604
|
return;
|
|
585
605
|
}
|
|
@@ -606,29 +626,29 @@ var xt, M, $, Ue = S(() => {
|
|
|
606
626
|
});
|
|
607
627
|
|
|
608
628
|
// src/db/sql/sql-client.ts
|
|
609
|
-
var
|
|
610
|
-
me(
|
|
611
|
-
DEFAULT_POOL_CONNECT_TIMEOUT_MS: () =>
|
|
612
|
-
DEFAULT_POOL_IDLE_MS: () =>
|
|
613
|
-
DEFAULT_POOL_MAX: () =>
|
|
614
|
-
LEASE_ENDPOINT: () =>
|
|
615
|
-
LEASE_RENEW_ENDPOINT: () =>
|
|
616
|
-
createDrizzleHandle: () =>
|
|
617
|
-
createHttpLeaseFetcher: () =>
|
|
618
|
-
createPgPool: () =>
|
|
619
|
-
createSqlClientFromConfig: () =>
|
|
620
|
-
createSqlClientWithDeps: () =>
|
|
629
|
+
var Ge = {};
|
|
630
|
+
me(Ge, {
|
|
631
|
+
DEFAULT_POOL_CONNECT_TIMEOUT_MS: () => Ke,
|
|
632
|
+
DEFAULT_POOL_IDLE_MS: () => ze,
|
|
633
|
+
DEFAULT_POOL_MAX: () => Qe,
|
|
634
|
+
LEASE_ENDPOINT: () => Be,
|
|
635
|
+
LEASE_RENEW_ENDPOINT: () => Ve,
|
|
636
|
+
createDrizzleHandle: () => Qt,
|
|
637
|
+
createHttpLeaseFetcher: () => je,
|
|
638
|
+
createPgPool: () => jt,
|
|
639
|
+
createSqlClientFromConfig: () => Kt,
|
|
640
|
+
createSqlClientWithDeps: () => He,
|
|
621
641
|
resolvePoolTuning: () => ue
|
|
622
642
|
});
|
|
623
|
-
function
|
|
643
|
+
function Bt(r) {
|
|
624
644
|
return r === "workspace" ? "staging" : r === "prod" ? "production" : "dev-local";
|
|
625
645
|
}
|
|
626
|
-
function
|
|
646
|
+
function je(r) {
|
|
627
647
|
return async (e) => {
|
|
628
|
-
let { httpRequest: t } = await Promise.resolve().then(() => (W(), U)), n = !!e?.leaseId, o = n ?
|
|
648
|
+
let { httpRequest: t } = await Promise.resolve().then(() => (W(), U)), n = !!e?.leaseId, o = n ? Ve : Be, i;
|
|
629
649
|
n ? i = { leaseId: e.leaseId } : (i = {
|
|
630
650
|
productId: r.productId ?? "",
|
|
631
|
-
environment:
|
|
651
|
+
environment: Bt(r.env ?? "prod")
|
|
632
652
|
}, e?.database !== void 0 && (i.database = e.database));
|
|
633
653
|
let s;
|
|
634
654
|
try {
|
|
@@ -641,7 +661,7 @@ function Be(r) {
|
|
|
641
661
|
retries: 2
|
|
642
662
|
});
|
|
643
663
|
} catch (a) {
|
|
644
|
-
let c = n ? "renovar" : "obter", l = a instanceof Error ? a.message : String(a), d = a instanceof
|
|
664
|
+
let c = n ? "renovar" : "obter", l = a instanceof Error ? a.message : String(a), d = a instanceof b ? a.reason : void 0;
|
|
645
665
|
if (d === "suspended" || d === "archived" || d === "revoked") {
|
|
646
666
|
let u = d === "suspended" ? "ambiente suspenso \u2014 a m\xE1quina que o servia parou; ser\xE1 religado quando o ambiente voltar" : d === "archived" ? "ambiente arquivado \u2014 este banco foi arquivado e n\xE3o aceita mais conex\xF5es" : "lease revogado \u2014 as credenciais deste ambiente foram revogadas pelo Core";
|
|
647
667
|
throw new exports.NeetruDbError(
|
|
@@ -654,10 +674,10 @@ function Be(r) {
|
|
|
654
674
|
`Falha ao ${c} lease SQL: ${l}`
|
|
655
675
|
);
|
|
656
676
|
}
|
|
657
|
-
return
|
|
677
|
+
return Vt(s);
|
|
658
678
|
};
|
|
659
679
|
}
|
|
660
|
-
function
|
|
680
|
+
function Vt(r) {
|
|
661
681
|
if (!r || typeof r != "object")
|
|
662
682
|
throw new exports.NeetruDbError("db_unavailable", "Resposta de lease inv\xE1lida (n\xE3o \xE9 objeto).");
|
|
663
683
|
let t = r.lease;
|
|
@@ -699,12 +719,12 @@ function ue() {
|
|
|
699
719
|
return {
|
|
700
720
|
// Teto 100: bem abaixo do `max_client_conn = 500` do PgBouncer, com folga
|
|
701
721
|
// para múltiplas instâncias do app dividirem o mesmo front-door.
|
|
702
|
-
max: de("NEETRU_DB_POOL_MAX",
|
|
722
|
+
max: de("NEETRU_DB_POOL_MAX", Qe, 1, 100),
|
|
703
723
|
// Teto 15min = janela do cert; piso 1s.
|
|
704
|
-
idleTimeoutMillis: de("NEETRU_DB_POOL_IDLE_MS",
|
|
724
|
+
idleTimeoutMillis: de("NEETRU_DB_POOL_IDLE_MS", ze, 1e3, 9e5),
|
|
705
725
|
connectionTimeoutMillis: de(
|
|
706
726
|
"NEETRU_DB_POOL_CONNECT_TIMEOUT_MS",
|
|
707
|
-
|
|
727
|
+
Ke,
|
|
708
728
|
1e3,
|
|
709
729
|
12e4
|
|
710
730
|
),
|
|
@@ -712,7 +732,7 @@ function ue() {
|
|
|
712
732
|
keepAliveInitialDelayMillis: 1e4
|
|
713
733
|
};
|
|
714
734
|
}
|
|
715
|
-
async function
|
|
735
|
+
async function jt(r) {
|
|
716
736
|
let { Pool: e } = await import(
|
|
717
737
|
/* webpackIgnore: true */
|
|
718
738
|
'pg'
|
|
@@ -732,14 +752,14 @@ async function Ut(r) {
|
|
|
732
752
|
...ue()
|
|
733
753
|
});
|
|
734
754
|
}
|
|
735
|
-
async function
|
|
755
|
+
async function Qt(r, e) {
|
|
736
756
|
let { drizzle: t } = await import(
|
|
737
757
|
/* webpackIgnore: true */
|
|
738
758
|
'drizzle-orm/node-postgres'
|
|
739
759
|
);
|
|
740
760
|
return t(r, { schema: e });
|
|
741
761
|
}
|
|
742
|
-
function
|
|
762
|
+
function zt(r, e) {
|
|
743
763
|
let t = null, n = null, o = () => t ? Promise.resolve(t) : (n || (n = e().then((s) => (t = s, n = null, s)).catch((s) => {
|
|
744
764
|
throw n = null, s;
|
|
745
765
|
})), n), i = {
|
|
@@ -755,10 +775,10 @@ function $t(r, e) {
|
|
|
755
775
|
};
|
|
756
776
|
return r && Object.setPrototypeOf(i, r), i;
|
|
757
777
|
}
|
|
758
|
-
async function
|
|
778
|
+
async function He(r, e) {
|
|
759
779
|
let t = e?.database !== void 0 ? { ...r, database: e.database } : r;
|
|
760
780
|
if (t.lazy) {
|
|
761
|
-
let c = null, l =
|
|
781
|
+
let c = null, l = zt(t.poolPrototype ?? null, () => {
|
|
762
782
|
if (!c)
|
|
763
783
|
throw new exports.NeetruDbError("db_unavailable", "SQL client n\xE3o inicializado (manager ausente).");
|
|
764
784
|
return c._ensureInitialLease();
|
|
@@ -766,11 +786,11 @@ async function ze(r, e) {
|
|
|
766
786
|
try {
|
|
767
787
|
u = t.createDrizzle(d, t.schema);
|
|
768
788
|
} catch (h) {
|
|
769
|
-
let
|
|
770
|
-
throw new exports.NeetruDbError("db_unavailable", `Falha ao criar handle Drizzle: ${
|
|
789
|
+
let _ = h instanceof Error ? h.message : String(h);
|
|
790
|
+
throw new exports.NeetruDbError("db_unavailable", `Falha ao criar handle Drizzle: ${_}`);
|
|
771
791
|
}
|
|
772
|
-
let
|
|
773
|
-
return c =
|
|
792
|
+
let p = new $(null, d, u, t);
|
|
793
|
+
return c = p, d.__neetruSetReLease(() => p._reactiveReLease()), p;
|
|
774
794
|
}
|
|
775
795
|
let n;
|
|
776
796
|
try {
|
|
@@ -799,8 +819,8 @@ async function ze(r, e) {
|
|
|
799
819
|
let a = new $(n, i, s, t);
|
|
800
820
|
return i.__neetruSetReLease(() => a._reactiveReLease()), a;
|
|
801
821
|
}
|
|
802
|
-
async function
|
|
803
|
-
let n =
|
|
822
|
+
async function Kt(r, e, t) {
|
|
823
|
+
let n = je(r), o, i;
|
|
804
824
|
try {
|
|
805
825
|
o = await import(
|
|
806
826
|
/* webpackIgnore: true */
|
|
@@ -816,7 +836,7 @@ async function Bt(r, e, t) {
|
|
|
816
836
|
);
|
|
817
837
|
}
|
|
818
838
|
let s = o.Pool ?? o.default?.Pool;
|
|
819
|
-
return
|
|
839
|
+
return He(
|
|
820
840
|
{
|
|
821
841
|
fetchLease: n,
|
|
822
842
|
createPool: (l) => {
|
|
@@ -851,24 +871,37 @@ async function Bt(r, e, t) {
|
|
|
851
871
|
t
|
|
852
872
|
);
|
|
853
873
|
}
|
|
854
|
-
var
|
|
874
|
+
var Be, Ve, Qe, ze, Ke, Xe = S(() => {
|
|
855
875
|
I();
|
|
856
876
|
x();
|
|
857
|
-
|
|
877
|
+
$e();
|
|
858
878
|
le();
|
|
859
|
-
|
|
860
|
-
|
|
879
|
+
Be = "/api/sdk/v1/db/lease", Ve = "/api/sdk/v1/db/lease/renew";
|
|
880
|
+
Qe = 10, ze = 6e4, Ke = 1e4;
|
|
861
881
|
});
|
|
862
882
|
|
|
863
883
|
// src/db/client-db.ts
|
|
864
884
|
I();
|
|
865
885
|
|
|
866
|
-
// src/
|
|
886
|
+
// src/runtime-env.ts
|
|
887
|
+
function tt() {
|
|
888
|
+
try {
|
|
889
|
+
if (typeof process < "u" && process.env)
|
|
890
|
+
return process.env.NODE_ENV === "production";
|
|
891
|
+
} catch {
|
|
892
|
+
}
|
|
893
|
+
return false;
|
|
894
|
+
}
|
|
867
895
|
function _e(r) {
|
|
896
|
+
return r === "dev" && !tt();
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
// src/db/offline/query-engine.ts
|
|
900
|
+
function ye(r) {
|
|
868
901
|
return r == null ? 0 : typeof r == "number" ? 1 : typeof r == "string" ? 2 : typeof r == "boolean" ? 3 : 4;
|
|
869
902
|
}
|
|
870
903
|
function A(r, e) {
|
|
871
|
-
let t =
|
|
904
|
+
let t = ye(r), n = ye(e);
|
|
872
905
|
if (t !== n) return t - n;
|
|
873
906
|
if (r == null) return 0;
|
|
874
907
|
if (typeof r == "number" && typeof e == "number") return r - e;
|
|
@@ -886,7 +919,7 @@ function Z(r, e) {
|
|
|
886
919
|
}
|
|
887
920
|
return n;
|
|
888
921
|
}
|
|
889
|
-
function
|
|
922
|
+
function nt(r, e) {
|
|
890
923
|
let t = Z(r, e.field);
|
|
891
924
|
if (t === void 0) return false;
|
|
892
925
|
let { op: n, value: o } = e;
|
|
@@ -917,10 +950,10 @@ function Ze(r, e) {
|
|
|
917
950
|
);
|
|
918
951
|
}
|
|
919
952
|
}
|
|
920
|
-
function
|
|
921
|
-
return e.every((t) =>
|
|
953
|
+
function rt(r, e) {
|
|
954
|
+
return e.every((t) => nt(r, t));
|
|
922
955
|
}
|
|
923
|
-
function
|
|
956
|
+
function ot(r) {
|
|
924
957
|
return (e, t) => {
|
|
925
958
|
if (r) {
|
|
926
959
|
let n = Z(e.data, r.field), o = Z(t.data, r.field), i = A(n, o);
|
|
@@ -930,7 +963,7 @@ function tt(r) {
|
|
|
930
963
|
return e.id < t.id ? -1 : e.id > t.id ? 1 : 0;
|
|
931
964
|
};
|
|
932
965
|
}
|
|
933
|
-
function
|
|
966
|
+
function it(r, e) {
|
|
934
967
|
let t = r.findIndex((n) => n.id === e.docId);
|
|
935
968
|
return t === -1 ? r : e.type === "startAfter" ? r.slice(t + 1) : r.slice(0, t);
|
|
936
969
|
}
|
|
@@ -948,9 +981,9 @@ var P = class r {
|
|
|
948
981
|
evaluate(e, t) {
|
|
949
982
|
let n = e.filter((d) => !d.meta.deleted), o = t.where ?? [];
|
|
950
983
|
o.length > 0 && (n = n.filter(
|
|
951
|
-
(d) =>
|
|
984
|
+
(d) => rt(d.data, o)
|
|
952
985
|
));
|
|
953
|
-
let i =
|
|
986
|
+
let i = ot(t.orderBy), s = [...n].sort(i), a = t.cursor ? it(s, t.cursor) : s, c = Math.min(t.limit ?? 20, 500);
|
|
954
987
|
return {
|
|
955
988
|
docs: a.slice(0, c).map((d) => ({ id: d.id, data: d.data })),
|
|
956
989
|
// `incomplete` é sempre true aqui — o QueryEngine não sabe se o cache
|
|
@@ -970,7 +1003,7 @@ var P = class r {
|
|
|
970
1003
|
};
|
|
971
1004
|
|
|
972
1005
|
// src/db/offline/local-store.ts
|
|
973
|
-
var
|
|
1006
|
+
var at = 1, T = "documents", R = "mutations", N = "query_cache", V = "sync_meta", E = "conflict_log", j = class {
|
|
974
1007
|
db = null;
|
|
975
1008
|
dbName;
|
|
976
1009
|
constructor(e) {
|
|
@@ -982,7 +1015,7 @@ var ot = 1, T = "documents", R = "mutations", N = "query_cache", V = "sync_meta"
|
|
|
982
1015
|
* Idempotente — chamadas subsequentes são no-ops se o banco já está aberto.
|
|
983
1016
|
*/
|
|
984
1017
|
async open() {
|
|
985
|
-
this.db === null && (this.db = await idb.openDB(this.dbName,
|
|
1018
|
+
this.db === null && (this.db = await idb.openDB(this.dbName, at, {
|
|
986
1019
|
upgrade(e) {
|
|
987
1020
|
if (!e.objectStoreNames.contains(T)) {
|
|
988
1021
|
let t = e.createObjectStore(T, {
|
|
@@ -1392,7 +1425,7 @@ var z = class {
|
|
|
1392
1425
|
async enqueue(e) {
|
|
1393
1426
|
let { collection: t, op: n, payload: o, baseVersion: i, batchId: s, upsert: a } = e, c = e.docId ?? (n === "add" ? ee() : "");
|
|
1394
1427
|
await this.syncSeq();
|
|
1395
|
-
let d = (await this.store.listMutations({ collection: t, docId: c })).filter((h) => h.status === "queued").sort((h,
|
|
1428
|
+
let d = (await this.store.listMutations({ collection: t, docId: c })).filter((h) => h.status === "queued").sort((h, _) => _.seq - h.seq)[0];
|
|
1396
1429
|
if (d !== void 0) {
|
|
1397
1430
|
let h = this.tryCoalesce(d, n, o, s, a);
|
|
1398
1431
|
if (h !== null) {
|
|
@@ -1411,11 +1444,11 @@ var z = class {
|
|
|
1411
1444
|
status: "queued",
|
|
1412
1445
|
batchId: s
|
|
1413
1446
|
};
|
|
1414
|
-
let { coalesced:
|
|
1415
|
-
return await this.store.putMutation(
|
|
1447
|
+
let { coalesced: _ } = h;
|
|
1448
|
+
return await this.store.putMutation(_), _;
|
|
1416
1449
|
}
|
|
1417
1450
|
}
|
|
1418
|
-
let
|
|
1451
|
+
let p = {
|
|
1419
1452
|
seq: this.nextSeq(),
|
|
1420
1453
|
mutationId: ee(),
|
|
1421
1454
|
collection: t,
|
|
@@ -1431,7 +1464,7 @@ var z = class {
|
|
|
1431
1464
|
// bug_0273e4dd: só persiste o flag quando verdadeiro (mantém o doc limpo).
|
|
1432
1465
|
...a ? { upsert: true } : {}
|
|
1433
1466
|
};
|
|
1434
|
-
return await this.store.putMutation(
|
|
1467
|
+
return await this.store.putMutation(p), p;
|
|
1435
1468
|
}
|
|
1436
1469
|
// ─── Leitura da fila ─────────────────────────────────────────────────────────
|
|
1437
1470
|
/**
|
|
@@ -1531,10 +1564,10 @@ var z = class {
|
|
|
1531
1564
|
|
|
1532
1565
|
// src/db/field-value.ts
|
|
1533
1566
|
var te = "__neetru__";
|
|
1534
|
-
function
|
|
1567
|
+
function ct() {
|
|
1535
1568
|
return { __neetru__: "serverTimestamp" };
|
|
1536
1569
|
}
|
|
1537
|
-
function
|
|
1570
|
+
function lt(r) {
|
|
1538
1571
|
if (typeof r != "number" || !Number.isFinite(r))
|
|
1539
1572
|
throw new TypeError(
|
|
1540
1573
|
`increment(n): n deve ser um n\xFAmero finito (recebido: ${String(r)}).`
|
|
@@ -1544,19 +1577,19 @@ function st(r) {
|
|
|
1544
1577
|
function D(r) {
|
|
1545
1578
|
return typeof r == "object" && r !== null && te in r && typeof r[te] == "string";
|
|
1546
1579
|
}
|
|
1547
|
-
function
|
|
1580
|
+
function ge(r) {
|
|
1548
1581
|
return D(r) && r.__neetru__ === "serverTimestamp";
|
|
1549
1582
|
}
|
|
1550
|
-
function
|
|
1583
|
+
function be(r) {
|
|
1551
1584
|
return D(r) && r.__neetru__ === "increment" && typeof r.operand == "number" && Number.isFinite(r.operand);
|
|
1552
1585
|
}
|
|
1553
|
-
function
|
|
1554
|
-
return
|
|
1586
|
+
function dt(r, e) {
|
|
1587
|
+
return ge(r) ? Date.now() : be(r) ? (typeof e == "number" && Number.isFinite(e) ? e : 0) + r.operand : r;
|
|
1555
1588
|
}
|
|
1556
1589
|
function k(r, e) {
|
|
1557
1590
|
let t = false, n = {};
|
|
1558
1591
|
for (let [o, i] of Object.entries(r))
|
|
1559
|
-
D(i) ? (t = true, n[o] =
|
|
1592
|
+
D(i) ? (t = true, n[o] = dt(i, e?.[o])) : n[o] = i;
|
|
1560
1593
|
return t ? n : r;
|
|
1561
1594
|
}
|
|
1562
1595
|
function ne(r) {
|
|
@@ -1566,11 +1599,11 @@ function ne(r) {
|
|
|
1566
1599
|
}
|
|
1567
1600
|
|
|
1568
1601
|
// src/db/offline/sync-engine.ts
|
|
1569
|
-
var
|
|
1570
|
-
function
|
|
1602
|
+
var ut = 8, pt = 1e3, ft = 300 * 1e3, re = "truncatedCollections";
|
|
1603
|
+
function ht(r) {
|
|
1571
1604
|
return r !== null && ne(r);
|
|
1572
1605
|
}
|
|
1573
|
-
function
|
|
1606
|
+
function mt(r) {
|
|
1574
1607
|
if (r === null) return null;
|
|
1575
1608
|
if (!ne(r)) return r;
|
|
1576
1609
|
let e = {};
|
|
@@ -1772,13 +1805,13 @@ var K = class {
|
|
|
1772
1805
|
}), s.push({ type: "removed", collection: e, doc: { id: t, data: a.data } }));
|
|
1773
1806
|
return;
|
|
1774
1807
|
}
|
|
1775
|
-
let l =
|
|
1808
|
+
let l = mt(i.payload) ?? a?.data ?? {}, d = {
|
|
1776
1809
|
collection: e,
|
|
1777
1810
|
id: t,
|
|
1778
1811
|
data: i.op === "update" ? { ...a?.data ?? {}, ...l } : (
|
|
1779
1812
|
// add/set: se o payload tinha sentinels, o cache otimista (existing.data)
|
|
1780
1813
|
// é a fonte de verdade até o pull; senão usa o payload literal.
|
|
1781
|
-
|
|
1814
|
+
ht(i.payload) ? { ...a?.data ?? {}, ...l } : l
|
|
1782
1815
|
),
|
|
1783
1816
|
meta: {
|
|
1784
1817
|
serverVersion: n,
|
|
@@ -1931,7 +1964,7 @@ var K = class {
|
|
|
1931
1964
|
* pending do doc no cache + registra `lastError`/dispara `onError`.
|
|
1932
1965
|
*/
|
|
1933
1966
|
async _retryOrDeadLetter(e, t, n) {
|
|
1934
|
-
if (e.attempts + 1 <
|
|
1967
|
+
if (e.attempts + 1 < ut) {
|
|
1935
1968
|
await this._queue.markRetry(e.mutationId, t);
|
|
1936
1969
|
return;
|
|
1937
1970
|
}
|
|
@@ -1972,7 +2005,7 @@ var K = class {
|
|
|
1972
2005
|
}
|
|
1973
2006
|
/** Backoff exponencial keyed em `attempts`, com teto `BACKOFF_CAP_MS`. */
|
|
1974
2007
|
_backoffDelayMs(e) {
|
|
1975
|
-
return Math.min(
|
|
2008
|
+
return Math.min(pt * 2 ** (e - 1), ft);
|
|
1976
2009
|
}
|
|
1977
2010
|
// ─── FASE 2 — pull (reconciliar o cache) ─────────────────────────────────────
|
|
1978
2011
|
/**
|
|
@@ -2224,7 +2257,7 @@ var K = class {
|
|
|
2224
2257
|
};
|
|
2225
2258
|
|
|
2226
2259
|
// src/db/offline/conflict-resolver.ts
|
|
2227
|
-
function
|
|
2260
|
+
function ve(r, e) {
|
|
2228
2261
|
return e === null ? false : r === null ? true : e > r;
|
|
2229
2262
|
}
|
|
2230
2263
|
var H = class r {
|
|
@@ -2261,7 +2294,7 @@ var H = class r {
|
|
|
2261
2294
|
resolvedData: t.data,
|
|
2262
2295
|
conflictRecord: null
|
|
2263
2296
|
};
|
|
2264
|
-
if (!
|
|
2297
|
+
if (!ve(
|
|
2265
2298
|
e.meta.updatedAtServer,
|
|
2266
2299
|
t.meta.updatedAtServer
|
|
2267
2300
|
))
|
|
@@ -2308,7 +2341,7 @@ var H = class r {
|
|
|
2308
2341
|
let i = t.data;
|
|
2309
2342
|
if (e === null)
|
|
2310
2343
|
return { outcome: "no_conflict", resolvedData: { ...i, ...n.payload ?? {} }, conflictRecord: null };
|
|
2311
|
-
if (!
|
|
2344
|
+
if (!ve(
|
|
2312
2345
|
e.meta.updatedAtServer,
|
|
2313
2346
|
t.meta.updatedAtServer
|
|
2314
2347
|
))
|
|
@@ -2386,7 +2419,7 @@ var H = class r {
|
|
|
2386
2419
|
};
|
|
2387
2420
|
|
|
2388
2421
|
// src/db/offline/change-bus.ts
|
|
2389
|
-
function
|
|
2422
|
+
function _t(r) {
|
|
2390
2423
|
return `${r.collection}::${r.doc.id}`;
|
|
2391
2424
|
}
|
|
2392
2425
|
var G = class {
|
|
@@ -2434,7 +2467,7 @@ var G = class {
|
|
|
2434
2467
|
if (e.length === 0) return;
|
|
2435
2468
|
let t = /* @__PURE__ */ new Map();
|
|
2436
2469
|
for (let i of e)
|
|
2437
|
-
t.set(
|
|
2470
|
+
t.set(_t(i), i);
|
|
2438
2471
|
let n = Array.from(t.values()), o = /* @__PURE__ */ new Map();
|
|
2439
2472
|
for (let i of n)
|
|
2440
2473
|
o.has(i.collection) || o.set(i.collection, []), o.get(i.collection).push(i);
|
|
@@ -2753,15 +2786,15 @@ var q = class {
|
|
|
2753
2786
|
|
|
2754
2787
|
// src/db/collection-ref.ts
|
|
2755
2788
|
I();
|
|
2756
|
-
function
|
|
2789
|
+
function yt() {
|
|
2757
2790
|
return typeof indexedDB > "u" || typeof window > "u";
|
|
2758
2791
|
}
|
|
2759
|
-
var
|
|
2760
|
-
function
|
|
2761
|
-
if (!
|
|
2792
|
+
var we = /^[a-z0-9][a-z0-9_-]{0,62}$/;
|
|
2793
|
+
function gt(r) {
|
|
2794
|
+
if (!we.test(r))
|
|
2762
2795
|
throw new exports.NeetruDbError(
|
|
2763
2796
|
"db_invalid_query",
|
|
2764
|
-
`Nome de cole\xE7\xE3o inv\xE1lido: "${r}". Deve seguir o padr\xE3o ${
|
|
2797
|
+
`Nome de cole\xE7\xE3o inv\xE1lido: "${r}". Deve seguir o padr\xE3o ${we}.`
|
|
2765
2798
|
);
|
|
2766
2799
|
}
|
|
2767
2800
|
function L(r, e = "id") {
|
|
@@ -2771,7 +2804,7 @@ function L(r, e = "id") {
|
|
|
2771
2804
|
`${e} \xE9 obrigat\xF3rio e deve ser uma string n\xE3o-vazia.`
|
|
2772
2805
|
);
|
|
2773
2806
|
}
|
|
2774
|
-
function
|
|
2807
|
+
function bt(r) {
|
|
2775
2808
|
let e = {};
|
|
2776
2809
|
if (r?.where && (e.where = r.where.map((t) => ({
|
|
2777
2810
|
field: t.field,
|
|
@@ -2788,7 +2821,7 @@ function _t(r) {
|
|
|
2788
2821
|
}
|
|
2789
2822
|
return e;
|
|
2790
2823
|
}
|
|
2791
|
-
function
|
|
2824
|
+
function vt(r, e) {
|
|
2792
2825
|
if (r.length < e) return null;
|
|
2793
2826
|
let t = r[r.length - 1];
|
|
2794
2827
|
return t ? btoa(JSON.stringify({ type: "startAfter", docId: t.id })) : null;
|
|
@@ -2835,11 +2868,11 @@ var oe = class {
|
|
|
2835
2868
|
}
|
|
2836
2869
|
/** Constrói um DbListResult para a coleção com query opcional. */
|
|
2837
2870
|
async _buildListResult(e) {
|
|
2838
|
-
let t =
|
|
2871
|
+
let t = bt(e), n = t.limit ?? 20, o = await this._store.listDocs(this._collection, t), i = await this._hasPendingWrites(), s = this._isOnline(), a = this._engine.getSyncState(), c = vt(o.docs, n), l = await this._store.getMeta(re), d = Array.isArray(l) && l.includes(this._collection), u = !s || a.status === "offline" || d, p = i || a.lastSyncedAt === null || u;
|
|
2839
2872
|
return {
|
|
2840
2873
|
docs: o.docs.map((h) => ({ id: h.id, data: h.data })),
|
|
2841
2874
|
nextCursor: c,
|
|
2842
|
-
fromCache:
|
|
2875
|
+
fromCache: p,
|
|
2843
2876
|
stale: u,
|
|
2844
2877
|
hasPendingWrites: i,
|
|
2845
2878
|
changes: [],
|
|
@@ -3013,7 +3046,7 @@ var oe = class {
|
|
|
3013
3046
|
doc: { id: s, data: l }
|
|
3014
3047
|
});
|
|
3015
3048
|
} else if (o.kind === "update") {
|
|
3016
|
-
let s = o.id, a = o.data, c = await this._store.getDoc(i, s), l = c?.meta.deleted ? void 0 : c?.data, d = k(a, l), u = { ...c?.data ?? {}, ...d },
|
|
3049
|
+
let s = o.id, a = o.data, c = await this._store.getDoc(i, s), l = c?.meta.deleted ? void 0 : c?.data, d = k(a, l), u = { ...c?.data ?? {}, ...d }, p = await this._queue.enqueue({
|
|
3017
3050
|
collection: i,
|
|
3018
3051
|
docId: s,
|
|
3019
3052
|
op: "update",
|
|
@@ -3034,7 +3067,7 @@ var oe = class {
|
|
|
3034
3067
|
state: "pending",
|
|
3035
3068
|
pendingMutationIds: [
|
|
3036
3069
|
...c?.meta.pendingMutationIds ?? [],
|
|
3037
|
-
|
|
3070
|
+
p.mutationId
|
|
3038
3071
|
],
|
|
3039
3072
|
deleted: false,
|
|
3040
3073
|
ownerId: c?.meta.ownerId ?? null
|
|
@@ -3178,7 +3211,7 @@ var oe = class {
|
|
|
3178
3211
|
this._store = e.store, this._queue = e.queue, this._bus = e.bus, this._engine = e.engine, this._connectivity = e.connectivity;
|
|
3179
3212
|
}
|
|
3180
3213
|
collection(e) {
|
|
3181
|
-
return
|
|
3214
|
+
return gt(e), new oe(
|
|
3182
3215
|
e,
|
|
3183
3216
|
this._store,
|
|
3184
3217
|
this._queue,
|
|
@@ -3207,8 +3240,8 @@ var oe = class {
|
|
|
3207
3240
|
return this._engine.onError(e);
|
|
3208
3241
|
}
|
|
3209
3242
|
};
|
|
3210
|
-
async function
|
|
3211
|
-
let e =
|
|
3243
|
+
async function Se(r) {
|
|
3244
|
+
let e = yt() ? new Q() : new j(r.dbName);
|
|
3212
3245
|
await e.open();
|
|
3213
3246
|
let t = new z(e), n = new H(), o = new G(), i = new X({
|
|
3214
3247
|
// Se startOnline=false, injeta um navigator falso
|
|
@@ -3243,9 +3276,9 @@ async function we(r) {
|
|
|
3243
3276
|
}
|
|
3244
3277
|
|
|
3245
3278
|
// src/db/realtime/realtime-client.ts
|
|
3246
|
-
var
|
|
3247
|
-
function
|
|
3248
|
-
return typeof globalThis.crypto?.randomUUID == "function" ? globalThis.crypto.randomUUID() : `nrt-sub-${Date.now()}-${++
|
|
3279
|
+
var wt = 0;
|
|
3280
|
+
function Te() {
|
|
3281
|
+
return typeof globalThis.crypto?.randomUUID == "function" ? globalThis.crypto.randomUUID() : `nrt-sub-${Date.now()}-${++wt}-${Math.random().toString(36).slice(2)}`;
|
|
3249
3282
|
}
|
|
3250
3283
|
var F = class {
|
|
3251
3284
|
// ── configuração ──────────────────────────────────────────────────────────
|
|
@@ -3285,7 +3318,7 @@ var F = class {
|
|
|
3285
3318
|
_pendingFrames = [];
|
|
3286
3319
|
// ── construtor ────────────────────────────────────────────────────────────
|
|
3287
3320
|
constructor(e) {
|
|
3288
|
-
this._gatewayUrl = e.gatewayUrl, this._wsFactory = e.webSocketFactory ??
|
|
3321
|
+
this._gatewayUrl = e.gatewayUrl, this._wsFactory = e.webSocketFactory ?? St, this._setTimeout = e.setTimeoutFn ?? globalThis.setTimeout.bind(globalThis), this._clearTimeout = e.clearTimeoutFn ?? globalThis.clearTimeout.bind(globalThis), this._backoffBaseMs = e.backoffBaseMs ?? 1e3, this._backoffMaxMs = e.backoffMaxMs ?? 3e4, this._heartbeatIntervalMs = e.heartbeatIntervalMs ?? 25e3, this._ticketProvider = e.ticketProvider, this._dbId = e.dbId, this._connect();
|
|
3289
3322
|
}
|
|
3290
3323
|
// ── API pública ───────────────────────────────────────────────────────────
|
|
3291
3324
|
/**
|
|
@@ -3299,8 +3332,8 @@ var F = class {
|
|
|
3299
3332
|
*/
|
|
3300
3333
|
subscribe(e, t, n) {
|
|
3301
3334
|
if (this._closed)
|
|
3302
|
-
return
|
|
3303
|
-
let o =
|
|
3335
|
+
return Te();
|
|
3336
|
+
let o = Te();
|
|
3304
3337
|
this._subscriptions.set(o, {
|
|
3305
3338
|
subscriptionId: o,
|
|
3306
3339
|
collection: e,
|
|
@@ -3564,7 +3597,7 @@ var F = class {
|
|
|
3564
3597
|
_detachHandlers(e) {
|
|
3565
3598
|
e.onopen = null, e.onmessage = null, e.onclose = null, e.onerror = null;
|
|
3566
3599
|
}
|
|
3567
|
-
},
|
|
3600
|
+
}, St = (r) => {
|
|
3568
3601
|
if (typeof WebSocket > "u")
|
|
3569
3602
|
throw new Error(
|
|
3570
3603
|
"[NeetruRealtimeClient] WebSocket n\xE3o dispon\xEDvel neste ambiente. Injete uma implementa\xE7\xE3o via `webSocketFactory` nas op\xE7\xF5es."
|
|
@@ -3574,11 +3607,11 @@ var F = class {
|
|
|
3574
3607
|
|
|
3575
3608
|
// src/db/client-db.ts
|
|
3576
3609
|
I();
|
|
3577
|
-
var
|
|
3578
|
-
function
|
|
3579
|
-
return e._transport ? e._transport : r === "firestore" && e.firestoreTransport ? e.firestoreTransport : r === "nosql-vm" && e.realtimeGatewayUrl ?
|
|
3610
|
+
var Ht = (r) => `/api/sdk/v1/datastore/${encodeURIComponent(r)}`, Y = (r, e) => `/api/sdk/v1/datastore/${encodeURIComponent(r)}/${encodeURIComponent(e)}`, Je = 200;
|
|
3611
|
+
function Gt(r, e, t) {
|
|
3612
|
+
return e._transport ? e._transport : r === "firestore" && e.firestoreTransport ? e.firestoreTransport : r === "nosql-vm" && e.realtimeGatewayUrl ? Xt(e.realtimeGatewayUrl, t, e) : Ye(t);
|
|
3580
3613
|
}
|
|
3581
|
-
function
|
|
3614
|
+
function Ye(r) {
|
|
3582
3615
|
return {
|
|
3583
3616
|
async pushMutations(e) {
|
|
3584
3617
|
if (!r)
|
|
@@ -3628,11 +3661,11 @@ function Xe(r) {
|
|
|
3628
3661
|
} catch (a) {
|
|
3629
3662
|
let c = a instanceof Error ? a.message : String(a), l = a?.code, d = a?.status;
|
|
3630
3663
|
if (l === "forbidden" || l === "unauthorized" || l === "not_found" || l === "conflict" || l === "validation_failed" || typeof d == "number" && d >= 400 && d < 500 && d !== 408 && d !== 429) {
|
|
3631
|
-
let
|
|
3664
|
+
let p = l === "forbidden" || l === "unauthorized" ? "rejected_permission" : "rejected_validation";
|
|
3632
3665
|
n.push({
|
|
3633
3666
|
mutationId: s.mutationId,
|
|
3634
3667
|
outcome: "rejected",
|
|
3635
|
-
reason:
|
|
3668
|
+
reason: p,
|
|
3636
3669
|
serverVersion: null,
|
|
3637
3670
|
serverData: null
|
|
3638
3671
|
});
|
|
@@ -3656,7 +3689,7 @@ function Xe(r) {
|
|
|
3656
3689
|
try {
|
|
3657
3690
|
l = await t(r, {
|
|
3658
3691
|
method: "GET",
|
|
3659
|
-
path:
|
|
3692
|
+
path: Ht(c),
|
|
3660
3693
|
requireAuth: !0,
|
|
3661
3694
|
retries: 2,
|
|
3662
3695
|
headers: o,
|
|
@@ -3664,37 +3697,37 @@ function Xe(r) {
|
|
|
3664
3697
|
// TRUNCADAS — reportadas em `truncatedCollections` p/ o SyncEngine
|
|
3665
3698
|
// (a) NÃO rodar deleção-por-ausência e (b) sinalizar
|
|
3666
3699
|
// `DbListResult.truncated`. Paginação por cursor é tarefa Core (gated).
|
|
3667
|
-
query: { limit:
|
|
3700
|
+
query: { limit: Je }
|
|
3668
3701
|
});
|
|
3669
|
-
} catch (
|
|
3670
|
-
let h =
|
|
3702
|
+
} catch (p) {
|
|
3703
|
+
let h = p instanceof Error ? p.message : String(p);
|
|
3671
3704
|
throw new exports.NeetruDbError(
|
|
3672
3705
|
"db_unavailable",
|
|
3673
3706
|
`[RestSyncTransport] fullResync falhou na cole\xE7\xE3o "${c}": ${h}`
|
|
3674
3707
|
);
|
|
3675
3708
|
}
|
|
3676
3709
|
let d = l, u = Array.isArray(d?.items) ? d.items : [];
|
|
3677
|
-
u.length >=
|
|
3678
|
-
for (let
|
|
3679
|
-
if (!
|
|
3680
|
-
let h =
|
|
3681
|
-
if (!
|
|
3682
|
-
let { id:
|
|
3683
|
-
if (typeof
|
|
3684
|
-
|
|
3685
|
-
else if (
|
|
3686
|
-
|
|
3687
|
-
else if (typeof
|
|
3688
|
-
let C = Date.parse(
|
|
3689
|
-
Number.isNaN(C) || (
|
|
3710
|
+
u.length >= Je && a.push(c);
|
|
3711
|
+
for (let p of u) {
|
|
3712
|
+
if (!p || typeof p != "object") continue;
|
|
3713
|
+
let h = p, _ = typeof h.id == "string" ? h.id : null;
|
|
3714
|
+
if (!_) continue;
|
|
3715
|
+
let { id: y, ...B } = h, g = i, v = B._updatedAt;
|
|
3716
|
+
if (typeof v == "number")
|
|
3717
|
+
g = v;
|
|
3718
|
+
else if (v !== null && typeof v == "object" && typeof v._seconds == "number")
|
|
3719
|
+
g = v._seconds * 1e3;
|
|
3720
|
+
else if (typeof v == "string") {
|
|
3721
|
+
let C = Date.parse(v);
|
|
3722
|
+
Number.isNaN(C) || (g = C);
|
|
3690
3723
|
}
|
|
3691
|
-
let w = `rest_${
|
|
3724
|
+
let w = `rest_${_}_${g}`;
|
|
3692
3725
|
s.push({
|
|
3693
3726
|
collection: c,
|
|
3694
|
-
id:
|
|
3727
|
+
id: _,
|
|
3695
3728
|
data: B,
|
|
3696
3729
|
serverVersion: w,
|
|
3697
|
-
serverTimestamp:
|
|
3730
|
+
serverTimestamp: g,
|
|
3698
3731
|
deleted: false
|
|
3699
3732
|
});
|
|
3700
3733
|
}
|
|
@@ -3703,10 +3736,10 @@ function Xe(r) {
|
|
|
3703
3736
|
}
|
|
3704
3737
|
};
|
|
3705
3738
|
}
|
|
3706
|
-
function
|
|
3707
|
-
let n =
|
|
3739
|
+
function Xt(r, e, t) {
|
|
3740
|
+
let n = Ye(e), o = new F({
|
|
3708
3741
|
gatewayUrl: r,
|
|
3709
|
-
ticketProvider:
|
|
3742
|
+
ticketProvider: Jt(e, t),
|
|
3710
3743
|
dbId: t.dbId,
|
|
3711
3744
|
webSocketFactory: t._wsFactory
|
|
3712
3745
|
});
|
|
@@ -3742,7 +3775,7 @@ function Qt(r, e, t) {
|
|
|
3742
3775
|
}
|
|
3743
3776
|
};
|
|
3744
3777
|
}
|
|
3745
|
-
function
|
|
3778
|
+
function Jt(r, e) {
|
|
3746
3779
|
return async () => {
|
|
3747
3780
|
let { httpRequest: t } = await Promise.resolve().then(() => (W(), U));
|
|
3748
3781
|
return await t(r, {
|
|
@@ -3757,27 +3790,27 @@ function zt(r, e) {
|
|
|
3757
3790
|
});
|
|
3758
3791
|
};
|
|
3759
3792
|
}
|
|
3760
|
-
function
|
|
3793
|
+
function Zn(r, e, t, n) {
|
|
3761
3794
|
return new F({ gatewayUrl: r, ticketProvider: e, dbId: t, webSocketFactory: n });
|
|
3762
3795
|
}
|
|
3763
3796
|
var pe = false;
|
|
3764
|
-
function
|
|
3797
|
+
function er() {
|
|
3765
3798
|
pe = false;
|
|
3766
3799
|
}
|
|
3767
|
-
function
|
|
3800
|
+
function Yt(r, e) {
|
|
3768
3801
|
pe || e.dbId && r.env !== "prod" && (typeof window > "u" || typeof console > "u" || typeof console.warn != "function" || (pe = true, console.warn(
|
|
3769
3802
|
'[neetru/sdk] client.db recebeu `dbId` ("' + e.dbId + '") mas ele N\xC3O roteia nem escopa nada no servidor: as escritas do mundo Documentos (add/set/update/remove/list) SEMPRE caem no datastore gen\xE9rico do Core, escopado s\xF3 por tenant/produto (header x-neetru-tenant). `dbId` apenas nomeia o cache offline LOCAL (IndexedDB). ATEN\xC7\xC3O: usar dbIds distintos no MESMO tenant/produto N\xC3O isola os dados no servidor \u2014 eles se misturam (co-mingling). Veja o JSDoc de NeetruDbOptions.dbId.'
|
|
3770
3803
|
)));
|
|
3771
3804
|
}
|
|
3772
|
-
function
|
|
3773
|
-
|
|
3805
|
+
function tr(r, e = {}) {
|
|
3806
|
+
Yt(r, e);
|
|
3774
3807
|
let t;
|
|
3775
3808
|
e.transport !== void 0 ? t = e.transport : e.engine !== void 0 ? (console.warn(
|
|
3776
3809
|
'[neetru/sdk] NeetruDbOptions.engine est\xE1 depreciado e ser\xE1 removido em v3.0. Use NeetruDbOptions.transport em vez de engine. Valores v\xE1lidos: "rest" | "firestore" | "nosql-vm". Nota: "engine" no SDK configura o TRANSPORTE (REST/Firestore/WebSocket), n\xE3o o storage engine do admin database (firestore-instance, cloud-sql-postgres, \u2026).'
|
|
3777
3810
|
), t = e.engine) : t = "rest";
|
|
3778
|
-
let n =
|
|
3811
|
+
let n = Gt(t, e, r), o = e.dbId ?? "default", i = e.dbName ?? `neetru-db__${r.productId ?? "sdk"}__${o}__${r.env}`, s = null, a = null;
|
|
3779
3812
|
function c() {
|
|
3780
|
-
return s || (s =
|
|
3813
|
+
return s || (s = Se({
|
|
3781
3814
|
dbName: i,
|
|
3782
3815
|
transport: n,
|
|
3783
3816
|
singleTab: e.singleTab ?? r.env !== "prod"
|
|
@@ -3785,15 +3818,15 @@ function Hn(r, e = {}) {
|
|
|
3785
3818
|
}
|
|
3786
3819
|
return {
|
|
3787
3820
|
collection(l) {
|
|
3788
|
-
return a ? a.collection(l) :
|
|
3821
|
+
return a ? a.collection(l) : Zt(l, c);
|
|
3789
3822
|
},
|
|
3790
3823
|
async sql(l, d) {
|
|
3791
|
-
if (r.env
|
|
3824
|
+
if (_e(r.env))
|
|
3792
3825
|
throw new exports.NeetruDbError(
|
|
3793
3826
|
"db_unavailable",
|
|
3794
3827
|
"[SDK] db.sql() n\xE3o dispon\xEDvel em NEETRU_ENV=dev. Use `neetru dev` para subir o container Postgres local."
|
|
3795
3828
|
);
|
|
3796
|
-
return (await Promise.resolve().then(() => (
|
|
3829
|
+
return (await Promise.resolve().then(() => (Xe(), Ge))).createSqlClientFromConfig(r, l, d);
|
|
3797
3830
|
},
|
|
3798
3831
|
get syncState() {
|
|
3799
3832
|
return a?.syncState ?? {
|
|
@@ -3806,8 +3839,8 @@ function Hn(r, e = {}) {
|
|
|
3806
3839
|
onSyncStateChanged(l) {
|
|
3807
3840
|
if (a) return a.onSyncStateChanged(l);
|
|
3808
3841
|
let d = null, u = false;
|
|
3809
|
-
return c().then((
|
|
3810
|
-
u || (d =
|
|
3842
|
+
return c().then((p) => {
|
|
3843
|
+
u || (d = p.onSyncStateChanged(l));
|
|
3811
3844
|
}), () => {
|
|
3812
3845
|
u = true, d?.();
|
|
3813
3846
|
};
|
|
@@ -3824,15 +3857,15 @@ function Hn(r, e = {}) {
|
|
|
3824
3857
|
onError(l) {
|
|
3825
3858
|
if (a) return a.onError(l);
|
|
3826
3859
|
let d = null, u = false;
|
|
3827
|
-
return c().then((
|
|
3828
|
-
u || (d =
|
|
3860
|
+
return c().then((p) => {
|
|
3861
|
+
u || (d = p.onError(l));
|
|
3829
3862
|
}), () => {
|
|
3830
3863
|
u = true, d?.();
|
|
3831
3864
|
};
|
|
3832
3865
|
}
|
|
3833
3866
|
};
|
|
3834
3867
|
}
|
|
3835
|
-
function
|
|
3868
|
+
function Zt(r, e) {
|
|
3836
3869
|
async function t() {
|
|
3837
3870
|
return (await e()).collection(r);
|
|
3838
3871
|
}
|
|
@@ -3911,12 +3944,12 @@ function Ht(r, e) {
|
|
|
3911
3944
|
}
|
|
3912
3945
|
|
|
3913
3946
|
exports.NEETRU_SENTINEL_KEY = te;
|
|
3914
|
-
exports.__resetDbIdWarningForTests =
|
|
3915
|
-
exports.createNeetruDb =
|
|
3916
|
-
exports.createRestSyncTransport =
|
|
3917
|
-
exports.getWebSocketRealtimeClient =
|
|
3918
|
-
exports.increment =
|
|
3947
|
+
exports.__resetDbIdWarningForTests = er;
|
|
3948
|
+
exports.createNeetruDb = tr;
|
|
3949
|
+
exports.createRestSyncTransport = Ye;
|
|
3950
|
+
exports.getWebSocketRealtimeClient = Zn;
|
|
3951
|
+
exports.increment = lt;
|
|
3919
3952
|
exports.isFieldSentinel = D;
|
|
3920
|
-
exports.isIncrementSentinel =
|
|
3921
|
-
exports.isServerTimestampSentinel =
|
|
3922
|
-
exports.serverTimestamp =
|
|
3953
|
+
exports.isIncrementSentinel = be;
|
|
3954
|
+
exports.isServerTimestampSentinel = ge;
|
|
3955
|
+
exports.serverTimestamp = ct;
|