@neetru/sdk 3.7.0 → 3.8.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 +55 -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 +1227 -1064
- package/dist/auth.d.cts +1 -1
- package/dist/auth.d.ts +1 -1
- package/dist/auth.mjs +1224 -1061
- 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 +370 -298
- package/dist/db.d.cts +1 -1
- package/dist/db.d.ts +1 -1
- package/dist/db.mjs +362 -290
- 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 +1409 -1075
- package/dist/index.d.cts +177 -3
- package/dist/index.d.ts +177 -3
- package/dist/index.mjs +1544 -1217
- 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-Bx4kTLmk.d.cts → types-D-9bjlM0.d.cts} +48 -1
- package/dist/{types-Dx0IrOSF.d.ts → types-bVztFQTI.d.ts} +48 -1
- 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/db.cjs
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
var idb = require('idb');
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
5
|
+
var Je = Object.defineProperty;
|
|
6
|
+
var S = (r, e) => () => (r && (e = r(r = 0)), e);
|
|
7
|
+
var me = (r, e) => {
|
|
8
8
|
for (var t in e)
|
|
9
|
-
|
|
9
|
+
Je(r, t, { get: e[t], enumerable: true });
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
// src/errors.ts
|
|
13
|
-
var g, x =
|
|
13
|
+
var g, x = S(() => {
|
|
14
14
|
g = class r extends Error {
|
|
15
15
|
code;
|
|
16
16
|
status;
|
|
@@ -24,16 +24,23 @@ var g, x = T(() => {
|
|
|
24
24
|
* para um `NeetruDbErrorCode` mais específico (recuperável vs não).
|
|
25
25
|
*/
|
|
26
26
|
reason;
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
/**
|
|
28
|
+
* 3.8.0: `x-correlation-id` da requisição que falhou. O SDK gera um UUID por
|
|
29
|
+
* chamada (ou usa o que o chamador passou) e manda no header; o Core grava o
|
|
30
|
+
* mesmo id nos logs/auditoria — cite-o ao abrir um ticket de suporte.
|
|
31
|
+
* `undefined` em erros que acontecem antes de qualquer requisição.
|
|
32
|
+
*/
|
|
33
|
+
correlationId;
|
|
34
|
+
constructor(e, t, n, o, i, s) {
|
|
35
|
+
super(t), this.name = "NeetruError", this.code = e, this.status = n, this.requestId = o, this.reason = i, this.correlationId = s, Object.setPrototypeOf(this, r.prototype);
|
|
29
36
|
}
|
|
30
37
|
};
|
|
31
38
|
});
|
|
32
39
|
|
|
33
40
|
// src/db-errors.ts
|
|
34
|
-
var
|
|
41
|
+
var Ye; exports.NeetruDbError = void 0; var I = S(() => {
|
|
35
42
|
x();
|
|
36
|
-
|
|
43
|
+
Ye = /* @__PURE__ */ new Set([
|
|
37
44
|
"db_unavailable",
|
|
38
45
|
"db_conflict",
|
|
39
46
|
"db_timeout"
|
|
@@ -51,13 +58,13 @@ var Qe; exports.NeetruDbError = void 0; var k = T(() => {
|
|
|
51
58
|
*/
|
|
52
59
|
dbId;
|
|
53
60
|
constructor(e, t, n) {
|
|
54
|
-
super(e, t), this.name = "NeetruDbError", this.code = e, this.retryable =
|
|
61
|
+
super(e, t), this.name = "NeetruDbError", this.code = e, this.retryable = Ye.has(e), this.dbId = n, Object.setPrototypeOf(this, r.prototype);
|
|
55
62
|
}
|
|
56
63
|
};
|
|
57
64
|
});
|
|
58
65
|
|
|
59
66
|
// src/idempotency.ts
|
|
60
|
-
function
|
|
67
|
+
function Te() {
|
|
61
68
|
let r = typeof globalThis < "u" && "crypto" in globalThis ? globalThis.crypto : void 0;
|
|
62
69
|
if (r && typeof r.randomUUID == "function")
|
|
63
70
|
return r.randomUUID();
|
|
@@ -66,21 +73,76 @@ function Se() {
|
|
|
66
73
|
"crypto.randomUUID not available in this runtime. SDK 3.0 requires Node \u226520 or modern browser/Edge."
|
|
67
74
|
);
|
|
68
75
|
}
|
|
69
|
-
var
|
|
76
|
+
var Re = S(() => {
|
|
70
77
|
x();
|
|
71
78
|
});
|
|
72
79
|
|
|
80
|
+
// src/correlation.ts
|
|
81
|
+
function ke(r) {
|
|
82
|
+
return typeof r == "string" && r.length > 0 && r.length <= 128 && vt.test(r);
|
|
83
|
+
}
|
|
84
|
+
function wt() {
|
|
85
|
+
let r = globalThis.crypto;
|
|
86
|
+
try {
|
|
87
|
+
if (r && typeof r.randomUUID == "function") return r.randomUUID();
|
|
88
|
+
} catch {
|
|
89
|
+
}
|
|
90
|
+
let e = new Uint8Array(16), t = false;
|
|
91
|
+
try {
|
|
92
|
+
r && typeof r.getRandomValues == "function" && (r.getRandomValues(e), t = !0);
|
|
93
|
+
} catch {
|
|
94
|
+
t = false;
|
|
95
|
+
}
|
|
96
|
+
if (!t)
|
|
97
|
+
for (let o = 0; o < e.length; o++) e[o] = Math.floor(Math.random() * 256);
|
|
98
|
+
e[6] = e[6] & 15 | 64, e[8] = e[8] & 63 | 128;
|
|
99
|
+
let n = Array.from(e, (o) => o.toString(16).padStart(2, "0")).join("");
|
|
100
|
+
return `${n.slice(0, 8)}-${n.slice(8, 12)}-${n.slice(12, 16)}-${n.slice(16, 20)}-${n.slice(20)}`;
|
|
101
|
+
}
|
|
102
|
+
function Ce(r, e) {
|
|
103
|
+
let t, n = {};
|
|
104
|
+
for (let [i, s] of Object.entries(r)) {
|
|
105
|
+
if (i.toLowerCase() === De) {
|
|
106
|
+
ke(s) && (t = s);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
n[i] = s;
|
|
110
|
+
}
|
|
111
|
+
let o = t ?? (ke(e) ? e : void 0) ?? wt();
|
|
112
|
+
return n[De] = o, { headers: n, correlationId: o };
|
|
113
|
+
}
|
|
114
|
+
var De, vt, Ie = S(() => {
|
|
115
|
+
De = "x-correlation-id", vt = /^[A-Za-z0-9._:\-]+$/;
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// src/server-only-key.ts
|
|
119
|
+
function Pe() {
|
|
120
|
+
try {
|
|
121
|
+
let r = globalThis.navigator;
|
|
122
|
+
if (r && r.product === "ReactNative") return "react-native";
|
|
123
|
+
} catch {
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
let r = globalThis;
|
|
127
|
+
if (typeof r.window < "u" && typeof r.document < "u") return "browser";
|
|
128
|
+
} catch {
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
var Ee = S(() => {
|
|
133
|
+
});
|
|
134
|
+
|
|
73
135
|
// src/http.ts
|
|
74
136
|
var U = {};
|
|
75
|
-
|
|
76
|
-
checkCoreVersionCompat: () =>
|
|
77
|
-
httpRequest: () =>
|
|
78
|
-
statusToCode: () =>
|
|
137
|
+
me(U, {
|
|
138
|
+
checkCoreVersionCompat: () => qe,
|
|
139
|
+
httpRequest: () => Mt,
|
|
140
|
+
statusToCode: () => Fe
|
|
79
141
|
});
|
|
80
142
|
function se(r) {
|
|
81
143
|
return r.split("+")[0] ?? r;
|
|
82
144
|
}
|
|
83
|
-
function
|
|
145
|
+
function Tt(r, e) {
|
|
84
146
|
let t = se(r).split(".").map(Number), n = se(e).split(".").map(Number), o = Math.max(t.length, n.length);
|
|
85
147
|
for (let i = 0; i < o; i++) {
|
|
86
148
|
let s = t[i] ?? 0, a = n[i] ?? 0;
|
|
@@ -88,58 +150,62 @@ function ht(r, e) {
|
|
|
88
150
|
}
|
|
89
151
|
return 0;
|
|
90
152
|
}
|
|
91
|
-
function
|
|
153
|
+
function Ne() {
|
|
92
154
|
try {
|
|
93
|
-
return "3.
|
|
155
|
+
return "3.8.0";
|
|
94
156
|
} catch {
|
|
95
157
|
return;
|
|
96
158
|
}
|
|
97
159
|
}
|
|
98
|
-
function
|
|
99
|
-
let r =
|
|
160
|
+
function Rt() {
|
|
161
|
+
let r = Ne();
|
|
100
162
|
return r ? parseInt(r.split(".")[0] ?? "3", 10) : 3;
|
|
101
163
|
}
|
|
102
|
-
function
|
|
164
|
+
function qe(r) {
|
|
103
165
|
if (!r) return;
|
|
104
|
-
let e =
|
|
166
|
+
let e = Rt(), t = St[e];
|
|
105
167
|
if (!t) return;
|
|
106
168
|
let n = se(r);
|
|
107
|
-
if (
|
|
169
|
+
if (Tt(n, t) < 0) {
|
|
108
170
|
let o = `${e}:${n}`;
|
|
109
|
-
|
|
171
|
+
Le.has(o) || (Le.add(o), console.warn(
|
|
110
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.`
|
|
111
173
|
));
|
|
112
174
|
}
|
|
113
175
|
}
|
|
114
|
-
function
|
|
176
|
+
function Dt() {
|
|
177
|
+
let r = "This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var.";
|
|
178
|
+
return Pe() ? "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
|
+
}
|
|
180
|
+
function Me(r) {
|
|
115
181
|
let e = 200 * Math.pow(4, r), t = e * 0.2 * (Math.random() * 2 - 1);
|
|
116
182
|
return Math.max(50, Math.round(e + t));
|
|
117
183
|
}
|
|
118
|
-
function
|
|
184
|
+
function Et(r) {
|
|
119
185
|
if (!r) return null;
|
|
120
186
|
let e = Number(r);
|
|
121
|
-
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), Oe);
|
|
122
188
|
let t = Date.parse(r);
|
|
123
189
|
if (Number.isFinite(t)) {
|
|
124
190
|
let n = t - Date.now();
|
|
125
|
-
if (n > 0) return Math.min(n,
|
|
191
|
+
if (n > 0) return Math.min(n, Oe);
|
|
126
192
|
}
|
|
127
193
|
return null;
|
|
128
194
|
}
|
|
129
|
-
function
|
|
195
|
+
function xe(r) {
|
|
130
196
|
return new Promise((e) => setTimeout(e, r));
|
|
131
197
|
}
|
|
132
|
-
function
|
|
198
|
+
function Fe(r) {
|
|
133
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";
|
|
134
200
|
}
|
|
135
|
-
function
|
|
201
|
+
function Lt(r, e, t) {
|
|
136
202
|
let n = r.replace(/\/+$/, ""), o = e.startsWith("/") ? e : `/${e}`, i = new URL(`${n}${o}`);
|
|
137
203
|
if (t)
|
|
138
204
|
for (let [s, a] of Object.entries(t))
|
|
139
205
|
a !== void 0 && i.searchParams.set(s, String(a));
|
|
140
206
|
return i.toString();
|
|
141
207
|
}
|
|
142
|
-
async function
|
|
208
|
+
async function Ae(r) {
|
|
143
209
|
let e = await r.text();
|
|
144
210
|
if (e)
|
|
145
211
|
try {
|
|
@@ -148,95 +214,101 @@ async function Pe(r) {
|
|
|
148
214
|
return;
|
|
149
215
|
}
|
|
150
216
|
}
|
|
151
|
-
async function
|
|
152
|
-
let t = e.method ?? "GET", n =
|
|
153
|
-
accept: "application/json",
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if (
|
|
217
|
+
async function Mt(r, e) {
|
|
218
|
+
let t = e.method ?? "GET", n = Lt(r.baseUrl, e.path, e.query), o = It.has(t) ? kt : Ct, i = e.retries ?? o, { headers: s, correlationId: a } = Ce(
|
|
219
|
+
{ accept: "application/json", ...e.headers },
|
|
220
|
+
e.correlationId
|
|
221
|
+
), c = Ne();
|
|
222
|
+
if (c && (s["x-neetru-sdk-version"] = c), e.requireAuth) {
|
|
157
223
|
if (!r.apiKey)
|
|
158
|
-
throw new g(
|
|
159
|
-
"missing_api_key",
|
|
160
|
-
"This operation requires an apiKey. Pass it to createNeetruClient({ apiKey }) or set NEETRU_API_KEY env var."
|
|
161
|
-
);
|
|
224
|
+
throw new g("missing_api_key", Dt());
|
|
162
225
|
s.authorization = `Bearer ${r.apiKey}`;
|
|
163
226
|
}
|
|
164
227
|
if (e.idempotencyKey) {
|
|
165
|
-
let
|
|
166
|
-
s["idempotency-key"] =
|
|
167
|
-
}
|
|
168
|
-
let
|
|
169
|
-
|
|
170
|
-
let
|
|
171
|
-
for (let
|
|
172
|
-
if (
|
|
173
|
-
throw
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
228
|
+
let f = typeof e.idempotencyKey == "string" ? e.idempotencyKey : Te();
|
|
229
|
+
s["idempotency-key"] = f;
|
|
230
|
+
}
|
|
231
|
+
let l = e.body !== void 0 && t !== "GET" && t !== "DELETE" ? JSON.stringify(e.body) : void 0;
|
|
232
|
+
l !== void 0 && (s["content-type"] = "application/json");
|
|
233
|
+
let d = null, u = e.deadlineMs != null ? Date.now() + e.deadlineMs : null;
|
|
234
|
+
for (let f = 0; f <= i; f++) {
|
|
235
|
+
if (u != null && Date.now() >= u)
|
|
236
|
+
throw d ?? new g(
|
|
237
|
+
"network_error",
|
|
238
|
+
"Deadline excedido antes de completar a request",
|
|
239
|
+
void 0,
|
|
240
|
+
void 0,
|
|
241
|
+
void 0,
|
|
242
|
+
a
|
|
243
|
+
);
|
|
244
|
+
let h = { method: t, headers: s };
|
|
245
|
+
l !== void 0 && (h.body = l);
|
|
246
|
+
let v = u != null ? Math.max(1, Math.min(3e4, u - Date.now())) : 3e4;
|
|
247
|
+
h.signal = AbortSignal.timeout(v);
|
|
248
|
+
let _;
|
|
179
249
|
try {
|
|
180
|
-
|
|
250
|
+
_ = await r.fetch(n, h);
|
|
181
251
|
} catch (m) {
|
|
182
252
|
let O = m instanceof DOMException && m.name === "TimeoutError" ? "Network error: timeout after 30s" : `Network error: ${m instanceof Error ? m.message : "fetch failed"}`;
|
|
183
|
-
if (
|
|
184
|
-
let
|
|
185
|
-
if (
|
|
186
|
-
await
|
|
253
|
+
if (d = new g("network_error", O, void 0, void 0, void 0, a), f < i) {
|
|
254
|
+
let he = Me(f);
|
|
255
|
+
if (u == null || Date.now() + he < u) {
|
|
256
|
+
await xe(he);
|
|
187
257
|
continue;
|
|
188
258
|
}
|
|
189
259
|
}
|
|
190
|
-
throw
|
|
260
|
+
throw d;
|
|
191
261
|
}
|
|
192
|
-
let
|
|
193
|
-
if (
|
|
194
|
-
let m =
|
|
195
|
-
return m &&
|
|
262
|
+
let B = _.headers.get("x-request-id") ?? _.headers.get("x-correlation-id") ?? void 0;
|
|
263
|
+
if (_.ok) {
|
|
264
|
+
let m = _.headers.get("x-neetru-version");
|
|
265
|
+
return m && qe(m), await Ae(_);
|
|
196
266
|
}
|
|
197
|
-
let
|
|
198
|
-
if (
|
|
199
|
-
let m =
|
|
200
|
-
typeof m == "string" ?
|
|
267
|
+
let y = await Ae(_), b = Fe(_.status), w = `HTTP ${_.status}`, C;
|
|
268
|
+
if (y && typeof y == "object") {
|
|
269
|
+
let m = y.error;
|
|
270
|
+
typeof m == "string" ? w = m : m && typeof m == "object" ? (typeof m.code == "string" && (b = m.code), typeof m.message == "string" && (w = m.message), typeof m.reason == "string" && (C = m.reason)) : (typeof y.code == "string" && (b = y.code), typeof y.message == "string" && (w = y.message)), typeof y.reason == "string" && (C = y.reason);
|
|
201
271
|
}
|
|
202
|
-
if (
|
|
203
|
-
let m =
|
|
204
|
-
|
|
272
|
+
if (_.status === 410) {
|
|
273
|
+
let m = _.headers.get("x-neetru-replacement");
|
|
274
|
+
w === `HTTP ${_.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}.`);
|
|
205
275
|
}
|
|
206
|
-
let
|
|
207
|
-
if (
|
|
208
|
-
let O =
|
|
209
|
-
if (
|
|
210
|
-
await
|
|
276
|
+
let fe = new g(b, w, _.status, B, C, a);
|
|
277
|
+
if (d = fe, Pt.has(b) && f < i) {
|
|
278
|
+
let O = Et(_.headers.get("retry-after")) ?? Me(f);
|
|
279
|
+
if (u == null || Date.now() + O < u) {
|
|
280
|
+
await xe(O);
|
|
211
281
|
continue;
|
|
212
282
|
}
|
|
213
283
|
}
|
|
214
|
-
throw
|
|
284
|
+
throw fe;
|
|
215
285
|
}
|
|
216
|
-
throw
|
|
286
|
+
throw d ?? new g("unknown", "unexpected httpRequest exit", void 0, void 0, void 0, a);
|
|
217
287
|
}
|
|
218
|
-
var
|
|
288
|
+
var St, Le, kt, Ct, It, Pt, Oe, W = S(() => {
|
|
219
289
|
x();
|
|
220
|
-
|
|
221
|
-
|
|
290
|
+
Re();
|
|
291
|
+
Ie();
|
|
292
|
+
Ee();
|
|
293
|
+
St = {
|
|
222
294
|
// SDK major 3.x requer Core ≥ 2026.05.1 (suporte a X-Neetru-Version header,
|
|
223
295
|
// runTransaction write-after-read, verifyWebhookRequest, webhooks 3.0+)
|
|
224
296
|
3: "2026.05.1"
|
|
225
297
|
};
|
|
226
|
-
|
|
227
|
-
|
|
298
|
+
Le = /* @__PURE__ */ new Set();
|
|
299
|
+
kt = 2, Ct = 0, It = /* @__PURE__ */ new Set(["GET", "HEAD"]), Pt = /* @__PURE__ */ new Set([
|
|
228
300
|
"rate_limited",
|
|
229
301
|
"server_error",
|
|
230
302
|
"network_error"
|
|
231
303
|
]);
|
|
232
|
-
|
|
304
|
+
Oe = 6e4;
|
|
233
305
|
});
|
|
234
306
|
|
|
235
307
|
// src/db/sql/resilient-pool.ts
|
|
236
308
|
function J(r) {
|
|
237
309
|
return typeof r == "object" && r !== null && r[ae] === true;
|
|
238
310
|
}
|
|
239
|
-
function
|
|
311
|
+
function Ot(r) {
|
|
240
312
|
let e = r && typeof r == "object" && "code" in r ? r.code : void 0;
|
|
241
313
|
if (e === "ECONNREFUSED" || e === "ETIMEDOUT" || e === "ENOTFOUND" || e === "EHOSTUNREACH" || e === "EAI_AGAIN")
|
|
242
314
|
return true;
|
|
@@ -265,7 +337,7 @@ function ce(r) {
|
|
|
265
337
|
return await o(e.current, c);
|
|
266
338
|
} catch (l) {
|
|
267
339
|
let d = t;
|
|
268
|
-
if (d === null || !
|
|
340
|
+
if (d === null || !Ot(l))
|
|
269
341
|
throw l;
|
|
270
342
|
try {
|
|
271
343
|
await d();
|
|
@@ -289,15 +361,15 @@ function ce(r) {
|
|
|
289
361
|
}
|
|
290
362
|
});
|
|
291
363
|
}
|
|
292
|
-
var ae, le =
|
|
364
|
+
var ae, le = S(() => {
|
|
293
365
|
ae = /* @__PURE__ */ Symbol.for("neetru.sdk.resilientPool");
|
|
294
366
|
});
|
|
295
367
|
|
|
296
368
|
// src/db/sql/lease.ts
|
|
297
|
-
function
|
|
369
|
+
function At(r, e) {
|
|
298
370
|
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;
|
|
299
371
|
}
|
|
300
|
-
function
|
|
372
|
+
function Nt(r) {
|
|
301
373
|
if (r instanceof exports.NeetruDbError) return r;
|
|
302
374
|
let e = r instanceof Error ? r.message : String(r), t = r instanceof Error ? r.code : void 0;
|
|
303
375
|
return typeof t == "string" && (t === "ECONNREFUSED" || t === "ENOTFOUND" || t === "ETIMEDOUT") ? new exports.NeetruDbError(
|
|
@@ -305,10 +377,10 @@ function kt(r) {
|
|
|
305
377
|
`Pool connection failed (${t}): ${e}`
|
|
306
378
|
) : 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}`);
|
|
307
379
|
}
|
|
308
|
-
var
|
|
309
|
-
|
|
380
|
+
var xt, M, $, Ue = S(() => {
|
|
381
|
+
I();
|
|
310
382
|
le();
|
|
311
|
-
|
|
383
|
+
xt = 0.8, M = 3e4, $ = class {
|
|
312
384
|
/**
|
|
313
385
|
* Lease atual. `null` no modo LAZY antes da 1ª query (o 1º lease é adiado —
|
|
314
386
|
* ver `_ensureInitialLease`). Após a 1ª aquisição, sempre não-nulo.
|
|
@@ -348,7 +420,7 @@ var Rt, E, $, Me = T(() => {
|
|
|
348
420
|
isolationLevel: t.isolationLevel
|
|
349
421
|
}) : await this._orm.transaction(e);
|
|
350
422
|
} catch (n) {
|
|
351
|
-
throw
|
|
423
|
+
throw Nt(n);
|
|
352
424
|
}
|
|
353
425
|
}
|
|
354
426
|
async close() {
|
|
@@ -366,13 +438,13 @@ var Rt, E, $, Me = T(() => {
|
|
|
366
438
|
* usa `MIN_RENEWAL_DELAY_MS` como fallback seguro.
|
|
367
439
|
*/
|
|
368
440
|
_calcRenewalDelayMs() {
|
|
369
|
-
if (!this._lease) return
|
|
441
|
+
if (!this._lease) return M;
|
|
370
442
|
let e = Date.parse(this._lease.expiresAt);
|
|
371
|
-
if (!Number.isFinite(e)) return
|
|
443
|
+
if (!Number.isFinite(e)) return M;
|
|
372
444
|
let t = this._deps.now(), n = e - t;
|
|
373
|
-
if (n <= 0) return
|
|
374
|
-
let o = n * (1 -
|
|
375
|
-
return Math.max(
|
|
445
|
+
if (n <= 0) return M;
|
|
446
|
+
let o = n * (1 - xt);
|
|
447
|
+
return Math.max(M, Math.round(o));
|
|
376
448
|
}
|
|
377
449
|
_scheduleRenewal() {
|
|
378
450
|
if (this._closed) return;
|
|
@@ -399,8 +471,8 @@ var Rt, E, $, Me = T(() => {
|
|
|
399
471
|
} catch (t) {
|
|
400
472
|
this._renewalTimer = setTimeout(() => {
|
|
401
473
|
this._doRenew();
|
|
402
|
-
},
|
|
403
|
-
`[SqlLeaseManager] renova\xE7\xE3o E emiss\xE3o de lease novo falharam; re-tentando em ${
|
|
474
|
+
}, M), console.warn(
|
|
475
|
+
`[SqlLeaseManager] renova\xE7\xE3o E emiss\xE3o de lease novo falharam; re-tentando em ${M}ms (cert TLS ef\xEAmero do servidor expira ~15min ap\xF3s o \xFAltimo swap):`,
|
|
404
476
|
t instanceof Error ? t.message : t
|
|
405
477
|
);
|
|
406
478
|
return;
|
|
@@ -507,7 +579,7 @@ var Rt, E, $, Me = T(() => {
|
|
|
507
579
|
* Exposto como método protegido para testes.
|
|
508
580
|
*/
|
|
509
581
|
async _swapPool(e) {
|
|
510
|
-
if (!
|
|
582
|
+
if (!At(this._lease, e)) {
|
|
511
583
|
this._lease = e;
|
|
512
584
|
return;
|
|
513
585
|
}
|
|
@@ -534,29 +606,29 @@ var Rt, E, $, Me = T(() => {
|
|
|
534
606
|
});
|
|
535
607
|
|
|
536
608
|
// src/db/sql/sql-client.ts
|
|
537
|
-
var
|
|
538
|
-
|
|
539
|
-
DEFAULT_POOL_CONNECT_TIMEOUT_MS: () =>
|
|
540
|
-
DEFAULT_POOL_IDLE_MS: () =>
|
|
541
|
-
DEFAULT_POOL_MAX: () =>
|
|
542
|
-
LEASE_ENDPOINT: () =>
|
|
543
|
-
LEASE_RENEW_ENDPOINT: () =>
|
|
544
|
-
createDrizzleHandle: () =>
|
|
545
|
-
createHttpLeaseFetcher: () =>
|
|
546
|
-
createPgPool: () =>
|
|
547
|
-
createSqlClientFromConfig: () =>
|
|
548
|
-
createSqlClientWithDeps: () =>
|
|
609
|
+
var Ke = {};
|
|
610
|
+
me(Ke, {
|
|
611
|
+
DEFAULT_POOL_CONNECT_TIMEOUT_MS: () => Qe,
|
|
612
|
+
DEFAULT_POOL_IDLE_MS: () => je,
|
|
613
|
+
DEFAULT_POOL_MAX: () => Ve,
|
|
614
|
+
LEASE_ENDPOINT: () => We,
|
|
615
|
+
LEASE_RENEW_ENDPOINT: () => $e,
|
|
616
|
+
createDrizzleHandle: () => Wt,
|
|
617
|
+
createHttpLeaseFetcher: () => Be,
|
|
618
|
+
createPgPool: () => Ut,
|
|
619
|
+
createSqlClientFromConfig: () => Bt,
|
|
620
|
+
createSqlClientWithDeps: () => ze,
|
|
549
621
|
resolvePoolTuning: () => ue
|
|
550
622
|
});
|
|
551
|
-
function
|
|
623
|
+
function qt(r) {
|
|
552
624
|
return r === "workspace" ? "staging" : r === "prod" ? "production" : "dev-local";
|
|
553
625
|
}
|
|
554
|
-
function
|
|
626
|
+
function Be(r) {
|
|
555
627
|
return async (e) => {
|
|
556
|
-
let { httpRequest: t } = await Promise.resolve().then(() => (W(), U)), n = !!e?.leaseId, o = n ?
|
|
628
|
+
let { httpRequest: t } = await Promise.resolve().then(() => (W(), U)), n = !!e?.leaseId, o = n ? $e : We, i;
|
|
557
629
|
n ? i = { leaseId: e.leaseId } : (i = {
|
|
558
630
|
productId: r.productId ?? "",
|
|
559
|
-
environment:
|
|
631
|
+
environment: qt(r.env ?? "prod")
|
|
560
632
|
}, e?.database !== void 0 && (i.database = e.database));
|
|
561
633
|
let s;
|
|
562
634
|
try {
|
|
@@ -582,10 +654,10 @@ function Ae(r) {
|
|
|
582
654
|
`Falha ao ${c} lease SQL: ${l}`
|
|
583
655
|
);
|
|
584
656
|
}
|
|
585
|
-
return
|
|
657
|
+
return Ft(s);
|
|
586
658
|
};
|
|
587
659
|
}
|
|
588
|
-
function
|
|
660
|
+
function Ft(r) {
|
|
589
661
|
if (!r || typeof r != "object")
|
|
590
662
|
throw new exports.NeetruDbError("db_unavailable", "Resposta de lease inv\xE1lida (n\xE3o \xE9 objeto).");
|
|
591
663
|
let t = r.lease;
|
|
@@ -627,12 +699,12 @@ function ue() {
|
|
|
627
699
|
return {
|
|
628
700
|
// Teto 100: bem abaixo do `max_client_conn = 500` do PgBouncer, com folga
|
|
629
701
|
// para múltiplas instâncias do app dividirem o mesmo front-door.
|
|
630
|
-
max: de("NEETRU_DB_POOL_MAX",
|
|
702
|
+
max: de("NEETRU_DB_POOL_MAX", Ve, 1, 100),
|
|
631
703
|
// Teto 15min = janela do cert; piso 1s.
|
|
632
|
-
idleTimeoutMillis: de("NEETRU_DB_POOL_IDLE_MS",
|
|
704
|
+
idleTimeoutMillis: de("NEETRU_DB_POOL_IDLE_MS", je, 1e3, 9e5),
|
|
633
705
|
connectionTimeoutMillis: de(
|
|
634
706
|
"NEETRU_DB_POOL_CONNECT_TIMEOUT_MS",
|
|
635
|
-
|
|
707
|
+
Qe,
|
|
636
708
|
1e3,
|
|
637
709
|
12e4
|
|
638
710
|
),
|
|
@@ -640,7 +712,7 @@ function ue() {
|
|
|
640
712
|
keepAliveInitialDelayMillis: 1e4
|
|
641
713
|
};
|
|
642
714
|
}
|
|
643
|
-
async function
|
|
715
|
+
async function Ut(r) {
|
|
644
716
|
let { Pool: e } = await import(
|
|
645
717
|
/* webpackIgnore: true */
|
|
646
718
|
'pg'
|
|
@@ -660,14 +732,14 @@ async function It(r) {
|
|
|
660
732
|
...ue()
|
|
661
733
|
});
|
|
662
734
|
}
|
|
663
|
-
async function
|
|
735
|
+
async function Wt(r, e) {
|
|
664
736
|
let { drizzle: t } = await import(
|
|
665
737
|
/* webpackIgnore: true */
|
|
666
738
|
'drizzle-orm/node-postgres'
|
|
667
739
|
);
|
|
668
740
|
return t(r, { schema: e });
|
|
669
741
|
}
|
|
670
|
-
function
|
|
742
|
+
function $t(r, e) {
|
|
671
743
|
let t = null, n = null, o = () => t ? Promise.resolve(t) : (n || (n = e().then((s) => (t = s, n = null, s)).catch((s) => {
|
|
672
744
|
throw n = null, s;
|
|
673
745
|
})), n), i = {
|
|
@@ -683,19 +755,19 @@ function Lt(r, e) {
|
|
|
683
755
|
};
|
|
684
756
|
return r && Object.setPrototypeOf(i, r), i;
|
|
685
757
|
}
|
|
686
|
-
async function
|
|
758
|
+
async function ze(r, e) {
|
|
687
759
|
let t = e?.database !== void 0 ? { ...r, database: e.database } : r;
|
|
688
760
|
if (t.lazy) {
|
|
689
|
-
let c = null, l =
|
|
761
|
+
let c = null, l = $t(t.poolPrototype ?? null, () => {
|
|
690
762
|
if (!c)
|
|
691
763
|
throw new exports.NeetruDbError("db_unavailable", "SQL client n\xE3o inicializado (manager ausente).");
|
|
692
764
|
return c._ensureInitialLease();
|
|
693
765
|
}), d = ce(l), u;
|
|
694
766
|
try {
|
|
695
767
|
u = t.createDrizzle(d, t.schema);
|
|
696
|
-
} catch (
|
|
697
|
-
let
|
|
698
|
-
throw new exports.NeetruDbError("db_unavailable", `Falha ao criar handle Drizzle: ${
|
|
768
|
+
} catch (h) {
|
|
769
|
+
let v = h instanceof Error ? h.message : String(h);
|
|
770
|
+
throw new exports.NeetruDbError("db_unavailable", `Falha ao criar handle Drizzle: ${v}`);
|
|
699
771
|
}
|
|
700
772
|
let f = new $(null, d, u, t);
|
|
701
773
|
return c = f, d.__neetruSetReLease(() => f._reactiveReLease()), f;
|
|
@@ -727,8 +799,8 @@ async function Ue(r, e) {
|
|
|
727
799
|
let a = new $(n, i, s, t);
|
|
728
800
|
return i.__neetruSetReLease(() => a._reactiveReLease()), a;
|
|
729
801
|
}
|
|
730
|
-
async function
|
|
731
|
-
let n =
|
|
802
|
+
async function Bt(r, e, t) {
|
|
803
|
+
let n = Be(r), o, i;
|
|
732
804
|
try {
|
|
733
805
|
o = await import(
|
|
734
806
|
/* webpackIgnore: true */
|
|
@@ -744,7 +816,7 @@ async function Mt(r, e, t) {
|
|
|
744
816
|
);
|
|
745
817
|
}
|
|
746
818
|
let s = o.Pool ?? o.default?.Pool;
|
|
747
|
-
return
|
|
819
|
+
return ze(
|
|
748
820
|
{
|
|
749
821
|
fetchLease: n,
|
|
750
822
|
createPool: (l) => {
|
|
@@ -779,24 +851,24 @@ async function Mt(r, e, t) {
|
|
|
779
851
|
t
|
|
780
852
|
);
|
|
781
853
|
}
|
|
782
|
-
var
|
|
783
|
-
|
|
854
|
+
var We, $e, Ve, je, Qe, He = S(() => {
|
|
855
|
+
I();
|
|
784
856
|
x();
|
|
785
|
-
|
|
857
|
+
Ue();
|
|
786
858
|
le();
|
|
787
|
-
|
|
788
|
-
|
|
859
|
+
We = "/api/sdk/v1/db/lease", $e = "/api/sdk/v1/db/lease/renew";
|
|
860
|
+
Ve = 10, je = 6e4, Qe = 1e4;
|
|
789
861
|
});
|
|
790
862
|
|
|
791
863
|
// src/db/client-db.ts
|
|
792
|
-
|
|
864
|
+
I();
|
|
793
865
|
|
|
794
866
|
// src/db/offline/query-engine.ts
|
|
795
|
-
function
|
|
867
|
+
function _e(r) {
|
|
796
868
|
return r == null ? 0 : typeof r == "number" ? 1 : typeof r == "string" ? 2 : typeof r == "boolean" ? 3 : 4;
|
|
797
869
|
}
|
|
798
870
|
function A(r, e) {
|
|
799
|
-
let t =
|
|
871
|
+
let t = _e(r), n = _e(e);
|
|
800
872
|
if (t !== n) return t - n;
|
|
801
873
|
if (r == null) return 0;
|
|
802
874
|
if (typeof r == "number" && typeof e == "number") return r - e;
|
|
@@ -814,7 +886,7 @@ function Z(r, e) {
|
|
|
814
886
|
}
|
|
815
887
|
return n;
|
|
816
888
|
}
|
|
817
|
-
function
|
|
889
|
+
function Ze(r, e) {
|
|
818
890
|
let t = Z(r, e.field);
|
|
819
891
|
if (t === void 0) return false;
|
|
820
892
|
let { op: n, value: o } = e;
|
|
@@ -845,10 +917,10 @@ function ze(r, e) {
|
|
|
845
917
|
);
|
|
846
918
|
}
|
|
847
919
|
}
|
|
848
|
-
function
|
|
849
|
-
return e.every((t) =>
|
|
920
|
+
function et(r, e) {
|
|
921
|
+
return e.every((t) => Ze(r, t));
|
|
850
922
|
}
|
|
851
|
-
function
|
|
923
|
+
function tt(r) {
|
|
852
924
|
return (e, t) => {
|
|
853
925
|
if (r) {
|
|
854
926
|
let n = Z(e.data, r.field), o = Z(t.data, r.field), i = A(n, o);
|
|
@@ -858,11 +930,11 @@ function He(r) {
|
|
|
858
930
|
return e.id < t.id ? -1 : e.id > t.id ? 1 : 0;
|
|
859
931
|
};
|
|
860
932
|
}
|
|
861
|
-
function
|
|
933
|
+
function nt(r, e) {
|
|
862
934
|
let t = r.findIndex((n) => n.id === e.docId);
|
|
863
935
|
return t === -1 ? r : e.type === "startAfter" ? r.slice(t + 1) : r.slice(0, t);
|
|
864
936
|
}
|
|
865
|
-
var
|
|
937
|
+
var P = class r {
|
|
866
938
|
/**
|
|
867
939
|
* Avalia um `QueryDescriptor` contra um array de `OfflineDoc`.
|
|
868
940
|
*
|
|
@@ -876,9 +948,9 @@ var C = class r {
|
|
|
876
948
|
evaluate(e, t) {
|
|
877
949
|
let n = e.filter((d) => !d.meta.deleted), o = t.where ?? [];
|
|
878
950
|
o.length > 0 && (n = n.filter(
|
|
879
|
-
(d) =>
|
|
951
|
+
(d) => et(d.data, o)
|
|
880
952
|
));
|
|
881
|
-
let i =
|
|
953
|
+
let i = tt(t.orderBy), s = [...n].sort(i), a = t.cursor ? nt(s, t.cursor) : s, c = Math.min(t.limit ?? 20, 500);
|
|
882
954
|
return {
|
|
883
955
|
docs: a.slice(0, c).map((d) => ({ id: d.id, data: d.data })),
|
|
884
956
|
// `incomplete` é sempre true aqui — o QueryEngine não sabe se o cache
|
|
@@ -898,7 +970,7 @@ var C = class r {
|
|
|
898
970
|
};
|
|
899
971
|
|
|
900
972
|
// src/db/offline/local-store.ts
|
|
901
|
-
var
|
|
973
|
+
var ot = 1, T = "documents", R = "mutations", N = "query_cache", V = "sync_meta", E = "conflict_log", j = class {
|
|
902
974
|
db = null;
|
|
903
975
|
dbName;
|
|
904
976
|
constructor(e) {
|
|
@@ -910,22 +982,22 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
910
982
|
* Idempotente — chamadas subsequentes são no-ops se o banco já está aberto.
|
|
911
983
|
*/
|
|
912
984
|
async open() {
|
|
913
|
-
this.db === null && (this.db = await idb.openDB(this.dbName,
|
|
985
|
+
this.db === null && (this.db = await idb.openDB(this.dbName, ot, {
|
|
914
986
|
upgrade(e) {
|
|
915
|
-
if (!e.objectStoreNames.contains(
|
|
916
|
-
let t = e.createObjectStore(
|
|
987
|
+
if (!e.objectStoreNames.contains(T)) {
|
|
988
|
+
let t = e.createObjectStore(T, {
|
|
917
989
|
keyPath: ["collection", "id"]
|
|
918
990
|
});
|
|
919
991
|
t.createIndex("by_collection", "collection"), t.createIndex("by_collection_state", ["collection", "meta.state"]), t.createIndex("by_updatedAtServer", "meta.updatedAtServer");
|
|
920
992
|
}
|
|
921
|
-
if (!e.objectStoreNames.contains(
|
|
922
|
-
let t = e.createObjectStore(
|
|
993
|
+
if (!e.objectStoreNames.contains(R)) {
|
|
994
|
+
let t = e.createObjectStore(R, {
|
|
923
995
|
keyPath: "mutationId"
|
|
924
996
|
});
|
|
925
997
|
t.createIndex("by_seq", "seq"), t.createIndex("by_status", "status"), t.createIndex("by_doc", ["collection", "docId"]), t.createIndex("by_batch", "batchId");
|
|
926
998
|
}
|
|
927
|
-
if (e.objectStoreNames.contains(N) || e.createObjectStore(N, { keyPath: "queryHash" }), e.objectStoreNames.contains(
|
|
928
|
-
let t = e.createObjectStore(
|
|
999
|
+
if (e.objectStoreNames.contains(N) || e.createObjectStore(N, { keyPath: "queryHash" }), e.objectStoreNames.contains(V) || e.createObjectStore(V, { keyPath: "key" }), !e.objectStoreNames.contains(E)) {
|
|
1000
|
+
let t = e.createObjectStore(E, {
|
|
929
1001
|
keyPath: "id",
|
|
930
1002
|
autoIncrement: true
|
|
931
1003
|
});
|
|
@@ -967,14 +1039,14 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
967
1039
|
* Retorna tombstones (deleted: true) — o chamador decide se deve mostrá-los.
|
|
968
1040
|
*/
|
|
969
1041
|
async getDoc(e, t) {
|
|
970
|
-
return await this.assertOpen().get(
|
|
1042
|
+
return await this.assertOpen().get(T, [e, t]) ?? null;
|
|
971
1043
|
}
|
|
972
1044
|
/**
|
|
973
1045
|
* Insere ou atualiza um documento na store `documents`.
|
|
974
1046
|
* O documento é identificado pelo keyPath composto `[collection, id]`.
|
|
975
1047
|
*/
|
|
976
1048
|
async putDoc(e) {
|
|
977
|
-
await this.assertOpen().put(
|
|
1049
|
+
await this.assertOpen().put(T, e);
|
|
978
1050
|
}
|
|
979
1051
|
/**
|
|
980
1052
|
* Marca um documento como tombstone (`deleted: true`).
|
|
@@ -982,8 +1054,8 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
982
1054
|
* No-op se o documento não existir.
|
|
983
1055
|
*/
|
|
984
1056
|
async deleteDoc(e, t) {
|
|
985
|
-
let n = this.assertOpen(), o = await n.get(
|
|
986
|
-
o && await n.put(
|
|
1057
|
+
let n = this.assertOpen(), o = await n.get(T, [e, t]);
|
|
1058
|
+
o && await n.put(T, {
|
|
987
1059
|
...o,
|
|
988
1060
|
meta: {
|
|
989
1061
|
...o.meta,
|
|
@@ -999,8 +1071,8 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
999
1071
|
* e delega a filtragem/ordenação/paginação ao QueryEngine (que opera em memória).
|
|
1000
1072
|
*/
|
|
1001
1073
|
async listDocs(e, t) {
|
|
1002
|
-
let o = await this.assertOpen().getAllFromIndex(
|
|
1003
|
-
return
|
|
1074
|
+
let o = await this.assertOpen().getAllFromIndex(T, "by_collection", e);
|
|
1075
|
+
return P.evaluate(o, t);
|
|
1004
1076
|
}
|
|
1005
1077
|
// ─── Sync meta (key-value) ──────────────────────────────────────────────────
|
|
1006
1078
|
/**
|
|
@@ -1011,14 +1083,14 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
1011
1083
|
* 'lastFullResyncAt', 'leaderTabId'.
|
|
1012
1084
|
*/
|
|
1013
1085
|
async getMeta(e) {
|
|
1014
|
-
let n = await this.assertOpen().get(
|
|
1086
|
+
let n = await this.assertOpen().get(V, e);
|
|
1015
1087
|
return n ? n.value : null;
|
|
1016
1088
|
}
|
|
1017
1089
|
/**
|
|
1018
1090
|
* Armazena ou atualiza um valor na store `sync_meta`.
|
|
1019
1091
|
*/
|
|
1020
1092
|
async setMeta(e, t) {
|
|
1021
|
-
await this.assertOpen().put(
|
|
1093
|
+
await this.assertOpen().put(V, { key: e, value: t });
|
|
1022
1094
|
}
|
|
1023
1095
|
// ─── Conflict log ───────────────────────────────────────────────────────────
|
|
1024
1096
|
/**
|
|
@@ -1026,7 +1098,7 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
1026
1098
|
* O `id` é autoIncrement — não deve ser fornecido pelo chamador.
|
|
1027
1099
|
*/
|
|
1028
1100
|
async appendConflict(e) {
|
|
1029
|
-
let n = await this.assertOpen().add(
|
|
1101
|
+
let n = await this.assertOpen().add(E, e);
|
|
1030
1102
|
return { ...e, id: n };
|
|
1031
1103
|
}
|
|
1032
1104
|
/**
|
|
@@ -1034,15 +1106,15 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
1034
1106
|
* Filtra por `delivered` se a opção for fornecida.
|
|
1035
1107
|
*/
|
|
1036
1108
|
async listConflicts(e) {
|
|
1037
|
-
let n = await this.assertOpen().getAll(
|
|
1109
|
+
let n = await this.assertOpen().getAll(E);
|
|
1038
1110
|
return e?.delivered !== void 0 ? n.filter((o) => o.delivered === e.delivered) : n;
|
|
1039
1111
|
}
|
|
1040
1112
|
/**
|
|
1041
1113
|
* Marca um registro do `conflict_log` como entregue ao produto.
|
|
1042
1114
|
*/
|
|
1043
1115
|
async markConflictDelivered(e) {
|
|
1044
|
-
let t = this.assertOpen(), n = await t.get(
|
|
1045
|
-
n && await t.put(
|
|
1116
|
+
let t = this.assertOpen(), n = await t.get(E, e);
|
|
1117
|
+
n && await t.put(E, { ...n, delivered: true });
|
|
1046
1118
|
}
|
|
1047
1119
|
// ─── Mutations (acessores usados pelo MutationQueue) ────────────────────────
|
|
1048
1120
|
/**
|
|
@@ -1050,13 +1122,13 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
1050
1122
|
* Key: `mutationId`.
|
|
1051
1123
|
*/
|
|
1052
1124
|
async putMutation(e) {
|
|
1053
|
-
await this.assertOpen().put(
|
|
1125
|
+
await this.assertOpen().put(R, e);
|
|
1054
1126
|
}
|
|
1055
1127
|
/**
|
|
1056
1128
|
* Retorna uma mutação pelo `mutationId`, ou `null` se não existir.
|
|
1057
1129
|
*/
|
|
1058
1130
|
async getMutation(e) {
|
|
1059
|
-
return await this.assertOpen().get(
|
|
1131
|
+
return await this.assertOpen().get(R, e) ?? null;
|
|
1060
1132
|
}
|
|
1061
1133
|
/**
|
|
1062
1134
|
* Lista mutações com filtros opcionais.
|
|
@@ -1064,14 +1136,14 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
1064
1136
|
*/
|
|
1065
1137
|
async listMutations(e) {
|
|
1066
1138
|
let t = this.assertOpen(), n;
|
|
1067
|
-
return e?.status !== void 0 ? n = await t.getAllFromIndex(
|
|
1139
|
+
return e?.status !== void 0 ? n = await t.getAllFromIndex(R, "by_status", e.status) : e?.collection !== void 0 && e.docId !== void 0 ? n = await t.getAllFromIndex(R, "by_doc", [e.collection, e.docId]) : n = await t.getAllFromIndex(R, "by_seq"), n.sort((o, i) => o.seq - i.seq);
|
|
1068
1140
|
}
|
|
1069
1141
|
/**
|
|
1070
1142
|
* Remove uma mutação pelo `mutationId`.
|
|
1071
1143
|
* No-op se não existir.
|
|
1072
1144
|
*/
|
|
1073
1145
|
async deleteMutation(e) {
|
|
1074
|
-
await this.assertOpen().delete(
|
|
1146
|
+
await this.assertOpen().delete(R, e);
|
|
1075
1147
|
}
|
|
1076
1148
|
// ─── Collection discovery ────────────────────────────────────────────────────
|
|
1077
1149
|
/**
|
|
@@ -1084,7 +1156,7 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
1084
1156
|
* coletar os valores únicos de forma eficiente (sem carregar os docs completos).
|
|
1085
1157
|
*/
|
|
1086
1158
|
async listCollections() {
|
|
1087
|
-
let t = await this.assertOpen().getAllFromIndex(
|
|
1159
|
+
let t = await this.assertOpen().getAllFromIndex(T, "by_collection"), n = /* @__PURE__ */ new Set();
|
|
1088
1160
|
for (let o of t)
|
|
1089
1161
|
n.add(o.collection);
|
|
1090
1162
|
return Array.from(n);
|
|
@@ -1111,7 +1183,7 @@ var Ye = 1, w = "documents", S = "mutations", N = "query_cache", B = "sync_meta"
|
|
|
1111
1183
|
};
|
|
1112
1184
|
|
|
1113
1185
|
// src/db/offline/memory-store.ts
|
|
1114
|
-
var
|
|
1186
|
+
var Q = class {
|
|
1115
1187
|
// store `documents` — key: `${collection}\0${id}`
|
|
1116
1188
|
_docs = /* @__PURE__ */ new Map();
|
|
1117
1189
|
// store `mutations` — key: mutationId
|
|
@@ -1159,7 +1231,7 @@ var V = class {
|
|
|
1159
1231
|
let n = Array.from(this._docs.values()).filter(
|
|
1160
1232
|
(o) => o.collection === e
|
|
1161
1233
|
);
|
|
1162
|
-
return
|
|
1234
|
+
return P.evaluate(n, t);
|
|
1163
1235
|
}
|
|
1164
1236
|
// ─── Sync meta ──────────────────────────────────────────────────────────────
|
|
1165
1237
|
async getMeta(e) {
|
|
@@ -1222,7 +1294,7 @@ function ee() {
|
|
|
1222
1294
|
return (r === "x" ? e : e & 3 | 8).toString(16);
|
|
1223
1295
|
});
|
|
1224
1296
|
}
|
|
1225
|
-
var
|
|
1297
|
+
var z = class {
|
|
1226
1298
|
store;
|
|
1227
1299
|
/**
|
|
1228
1300
|
* Ponteiro de sequência local.
|
|
@@ -1320,11 +1392,11 @@ var Q = class {
|
|
|
1320
1392
|
async enqueue(e) {
|
|
1321
1393
|
let { collection: t, op: n, payload: o, baseVersion: i, batchId: s, upsert: a } = e, c = e.docId ?? (n === "add" ? ee() : "");
|
|
1322
1394
|
await this.syncSeq();
|
|
1323
|
-
let d = (await this.store.listMutations({ collection: t, docId: c })).filter((
|
|
1395
|
+
let d = (await this.store.listMutations({ collection: t, docId: c })).filter((h) => h.status === "queued").sort((h, v) => v.seq - h.seq)[0];
|
|
1324
1396
|
if (d !== void 0) {
|
|
1325
|
-
let
|
|
1326
|
-
if (
|
|
1327
|
-
if ("removed" in
|
|
1397
|
+
let h = this.tryCoalesce(d, n, o, s, a);
|
|
1398
|
+
if (h !== null) {
|
|
1399
|
+
if ("removed" in h)
|
|
1328
1400
|
return await this.store.deleteMutation(d.mutationId), {
|
|
1329
1401
|
seq: d.seq,
|
|
1330
1402
|
mutationId: ee(),
|
|
@@ -1339,8 +1411,8 @@ var Q = class {
|
|
|
1339
1411
|
status: "queued",
|
|
1340
1412
|
batchId: s
|
|
1341
1413
|
};
|
|
1342
|
-
let { coalesced:
|
|
1343
|
-
return await this.store.putMutation(
|
|
1414
|
+
let { coalesced: v } = h;
|
|
1415
|
+
return await this.store.putMutation(v), v;
|
|
1344
1416
|
}
|
|
1345
1417
|
}
|
|
1346
1418
|
let f = {
|
|
@@ -1459,54 +1531,54 @@ var Q = class {
|
|
|
1459
1531
|
|
|
1460
1532
|
// src/db/field-value.ts
|
|
1461
1533
|
var te = "__neetru__";
|
|
1462
|
-
function
|
|
1534
|
+
function it() {
|
|
1463
1535
|
return { __neetru__: "serverTimestamp" };
|
|
1464
1536
|
}
|
|
1465
|
-
function
|
|
1537
|
+
function st(r) {
|
|
1466
1538
|
if (typeof r != "number" || !Number.isFinite(r))
|
|
1467
1539
|
throw new TypeError(
|
|
1468
1540
|
`increment(n): n deve ser um n\xFAmero finito (recebido: ${String(r)}).`
|
|
1469
1541
|
);
|
|
1470
1542
|
return { __neetru__: "increment", operand: r };
|
|
1471
1543
|
}
|
|
1472
|
-
function
|
|
1544
|
+
function D(r) {
|
|
1473
1545
|
return typeof r == "object" && r !== null && te in r && typeof r[te] == "string";
|
|
1474
1546
|
}
|
|
1475
|
-
function _e(r) {
|
|
1476
|
-
return R(r) && r.__neetru__ === "serverTimestamp";
|
|
1477
|
-
}
|
|
1478
1547
|
function ye(r) {
|
|
1479
|
-
return
|
|
1548
|
+
return D(r) && r.__neetru__ === "serverTimestamp";
|
|
1480
1549
|
}
|
|
1481
|
-
function
|
|
1482
|
-
return
|
|
1550
|
+
function ge(r) {
|
|
1551
|
+
return D(r) && r.__neetru__ === "increment" && typeof r.operand == "number" && Number.isFinite(r.operand);
|
|
1552
|
+
}
|
|
1553
|
+
function at(r, e) {
|
|
1554
|
+
return ye(r) ? Date.now() : ge(r) ? (typeof e == "number" && Number.isFinite(e) ? e : 0) + r.operand : r;
|
|
1483
1555
|
}
|
|
1484
|
-
function
|
|
1556
|
+
function k(r, e) {
|
|
1485
1557
|
let t = false, n = {};
|
|
1486
1558
|
for (let [o, i] of Object.entries(r))
|
|
1487
|
-
|
|
1559
|
+
D(i) ? (t = true, n[o] = at(i, e?.[o])) : n[o] = i;
|
|
1488
1560
|
return t ? n : r;
|
|
1489
1561
|
}
|
|
1490
1562
|
function ne(r) {
|
|
1491
1563
|
for (let e of Object.values(r))
|
|
1492
|
-
if (
|
|
1564
|
+
if (D(e)) return true;
|
|
1493
1565
|
return false;
|
|
1494
1566
|
}
|
|
1495
1567
|
|
|
1496
1568
|
// src/db/offline/sync-engine.ts
|
|
1497
|
-
var
|
|
1498
|
-
function
|
|
1569
|
+
var ct = 8, lt = 1e3, dt = 300 * 1e3, re = "truncatedCollections";
|
|
1570
|
+
function ut(r) {
|
|
1499
1571
|
return r !== null && ne(r);
|
|
1500
1572
|
}
|
|
1501
|
-
function
|
|
1573
|
+
function pt(r) {
|
|
1502
1574
|
if (r === null) return null;
|
|
1503
1575
|
if (!ne(r)) return r;
|
|
1504
1576
|
let e = {};
|
|
1505
1577
|
for (let [t, n] of Object.entries(r))
|
|
1506
|
-
|
|
1578
|
+
D(n) || (e[t] = n);
|
|
1507
1579
|
return e;
|
|
1508
1580
|
}
|
|
1509
|
-
var
|
|
1581
|
+
var K = class {
|
|
1510
1582
|
_store;
|
|
1511
1583
|
_queue;
|
|
1512
1584
|
_resolver;
|
|
@@ -1700,13 +1772,13 @@ var z = class {
|
|
|
1700
1772
|
}), s.push({ type: "removed", collection: e, doc: { id: t, data: a.data } }));
|
|
1701
1773
|
return;
|
|
1702
1774
|
}
|
|
1703
|
-
let l =
|
|
1775
|
+
let l = pt(i.payload) ?? a?.data ?? {}, d = {
|
|
1704
1776
|
collection: e,
|
|
1705
1777
|
id: t,
|
|
1706
1778
|
data: i.op === "update" ? { ...a?.data ?? {}, ...l } : (
|
|
1707
1779
|
// add/set: se o payload tinha sentinels, o cache otimista (existing.data)
|
|
1708
1780
|
// é a fonte de verdade até o pull; senão usa o payload literal.
|
|
1709
|
-
|
|
1781
|
+
ut(i.payload) ? { ...a?.data ?? {}, ...l } : l
|
|
1710
1782
|
),
|
|
1711
1783
|
meta: {
|
|
1712
1784
|
serverVersion: n,
|
|
@@ -1859,7 +1931,7 @@ var z = class {
|
|
|
1859
1931
|
* pending do doc no cache + registra `lastError`/dispara `onError`.
|
|
1860
1932
|
*/
|
|
1861
1933
|
async _retryOrDeadLetter(e, t, n) {
|
|
1862
|
-
if (e.attempts + 1 <
|
|
1934
|
+
if (e.attempts + 1 < ct) {
|
|
1863
1935
|
await this._queue.markRetry(e.mutationId, t);
|
|
1864
1936
|
return;
|
|
1865
1937
|
}
|
|
@@ -1900,7 +1972,7 @@ var z = class {
|
|
|
1900
1972
|
}
|
|
1901
1973
|
/** Backoff exponencial keyed em `attempts`, com teto `BACKOFF_CAP_MS`. */
|
|
1902
1974
|
_backoffDelayMs(e) {
|
|
1903
|
-
return Math.min(
|
|
1975
|
+
return Math.min(lt * 2 ** (e - 1), dt);
|
|
1904
1976
|
}
|
|
1905
1977
|
// ─── FASE 2 — pull (reconciliar o cache) ─────────────────────────────────────
|
|
1906
1978
|
/**
|
|
@@ -2152,10 +2224,10 @@ var z = class {
|
|
|
2152
2224
|
};
|
|
2153
2225
|
|
|
2154
2226
|
// src/db/offline/conflict-resolver.ts
|
|
2155
|
-
function
|
|
2227
|
+
function be(r, e) {
|
|
2156
2228
|
return e === null ? false : r === null ? true : e > r;
|
|
2157
2229
|
}
|
|
2158
|
-
var
|
|
2230
|
+
var H = class r {
|
|
2159
2231
|
/**
|
|
2160
2232
|
* Resolve um conflito com base na operação da mutação (auto-dispatch).
|
|
2161
2233
|
*
|
|
@@ -2189,7 +2261,7 @@ var K = class r {
|
|
|
2189
2261
|
resolvedData: t.data,
|
|
2190
2262
|
conflictRecord: null
|
|
2191
2263
|
};
|
|
2192
|
-
if (!
|
|
2264
|
+
if (!be(
|
|
2193
2265
|
e.meta.updatedAtServer,
|
|
2194
2266
|
t.meta.updatedAtServer
|
|
2195
2267
|
))
|
|
@@ -2236,7 +2308,7 @@ var K = class r {
|
|
|
2236
2308
|
let i = t.data;
|
|
2237
2309
|
if (e === null)
|
|
2238
2310
|
return { outcome: "no_conflict", resolvedData: { ...i, ...n.payload ?? {} }, conflictRecord: null };
|
|
2239
|
-
if (!
|
|
2311
|
+
if (!be(
|
|
2240
2312
|
e.meta.updatedAtServer,
|
|
2241
2313
|
t.meta.updatedAtServer
|
|
2242
2314
|
))
|
|
@@ -2314,10 +2386,10 @@ var K = class r {
|
|
|
2314
2386
|
};
|
|
2315
2387
|
|
|
2316
2388
|
// src/db/offline/change-bus.ts
|
|
2317
|
-
function
|
|
2389
|
+
function ft(r) {
|
|
2318
2390
|
return `${r.collection}::${r.doc.id}`;
|
|
2319
2391
|
}
|
|
2320
|
-
var
|
|
2392
|
+
var G = class {
|
|
2321
2393
|
/** Listeners filtrados por coleção. */
|
|
2322
2394
|
_collectionListeners = /* @__PURE__ */ new Map();
|
|
2323
2395
|
/** Listeners globais (todas as coleções). */
|
|
@@ -2362,7 +2434,7 @@ var H = class {
|
|
|
2362
2434
|
if (e.length === 0) return;
|
|
2363
2435
|
let t = /* @__PURE__ */ new Map();
|
|
2364
2436
|
for (let i of e)
|
|
2365
|
-
t.set(
|
|
2437
|
+
t.set(ft(i), i);
|
|
2366
2438
|
let n = Array.from(t.values()), o = /* @__PURE__ */ new Map();
|
|
2367
2439
|
for (let i of n)
|
|
2368
2440
|
o.has(i.collection) || o.set(i.collection, []), o.get(i.collection).push(i);
|
|
@@ -2401,7 +2473,7 @@ var H = class {
|
|
|
2401
2473
|
};
|
|
2402
2474
|
|
|
2403
2475
|
// src/db/offline/connectivity-monitor.ts
|
|
2404
|
-
var
|
|
2476
|
+
var X = class {
|
|
2405
2477
|
_state;
|
|
2406
2478
|
_listeners = /* @__PURE__ */ new Set();
|
|
2407
2479
|
_nav;
|
|
@@ -2680,26 +2752,26 @@ var q = class {
|
|
|
2680
2752
|
};
|
|
2681
2753
|
|
|
2682
2754
|
// src/db/collection-ref.ts
|
|
2683
|
-
|
|
2684
|
-
function
|
|
2755
|
+
I();
|
|
2756
|
+
function ht() {
|
|
2685
2757
|
return typeof indexedDB > "u" || typeof window > "u";
|
|
2686
2758
|
}
|
|
2687
|
-
var
|
|
2688
|
-
function
|
|
2689
|
-
if (!
|
|
2759
|
+
var ve = /^[a-z0-9][a-z0-9_-]{0,62}$/;
|
|
2760
|
+
function mt(r) {
|
|
2761
|
+
if (!ve.test(r))
|
|
2690
2762
|
throw new exports.NeetruDbError(
|
|
2691
2763
|
"db_invalid_query",
|
|
2692
|
-
`Nome de cole\xE7\xE3o inv\xE1lido: "${r}". Deve seguir o padr\xE3o ${
|
|
2764
|
+
`Nome de cole\xE7\xE3o inv\xE1lido: "${r}". Deve seguir o padr\xE3o ${ve}.`
|
|
2693
2765
|
);
|
|
2694
2766
|
}
|
|
2695
|
-
function
|
|
2767
|
+
function L(r, e = "id") {
|
|
2696
2768
|
if (!r || typeof r != "string" || r.trim() === "")
|
|
2697
2769
|
throw new exports.NeetruDbError(
|
|
2698
2770
|
"db_invalid_query",
|
|
2699
2771
|
`${e} \xE9 obrigat\xF3rio e deve ser uma string n\xE3o-vazia.`
|
|
2700
2772
|
);
|
|
2701
2773
|
}
|
|
2702
|
-
function
|
|
2774
|
+
function _t(r) {
|
|
2703
2775
|
let e = {};
|
|
2704
2776
|
if (r?.where && (e.where = r.where.map((t) => ({
|
|
2705
2777
|
field: t.field,
|
|
@@ -2716,7 +2788,7 @@ function lt(r) {
|
|
|
2716
2788
|
}
|
|
2717
2789
|
return e;
|
|
2718
2790
|
}
|
|
2719
|
-
function
|
|
2791
|
+
function yt(r, e) {
|
|
2720
2792
|
if (r.length < e) return null;
|
|
2721
2793
|
let t = r[r.length - 1];
|
|
2722
2794
|
return t ? btoa(JSON.stringify({ type: "startAfter", docId: t.id })) : null;
|
|
@@ -2763,9 +2835,9 @@ var oe = class {
|
|
|
2763
2835
|
}
|
|
2764
2836
|
/** Constrói um DbListResult para a coleção com query opcional. */
|
|
2765
2837
|
async _buildListResult(e) {
|
|
2766
|
-
let t =
|
|
2838
|
+
let t = _t(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 = yt(o.docs, n), l = await this._store.getMeta(re), d = Array.isArray(l) && l.includes(this._collection), u = !s || a.status === "offline" || d, f = i || a.lastSyncedAt === null || u;
|
|
2767
2839
|
return {
|
|
2768
|
-
docs: o.docs.map((
|
|
2840
|
+
docs: o.docs.map((h) => ({ id: h.id, data: h.data })),
|
|
2769
2841
|
nextCursor: c,
|
|
2770
2842
|
fromCache: f,
|
|
2771
2843
|
stale: u,
|
|
@@ -2776,13 +2848,13 @@ var oe = class {
|
|
|
2776
2848
|
}
|
|
2777
2849
|
// ── CRUD ────────────────────────────────────────────────────────────────────
|
|
2778
2850
|
async get(e) {
|
|
2779
|
-
return
|
|
2851
|
+
return L(e), this._buildGetResult(e);
|
|
2780
2852
|
}
|
|
2781
2853
|
async list(e) {
|
|
2782
2854
|
return this._buildListResult(e);
|
|
2783
2855
|
}
|
|
2784
2856
|
async add(e) {
|
|
2785
|
-
let t = e, n =
|
|
2857
|
+
let t = e, n = k(t, void 0), o = await this._queue.enqueue({
|
|
2786
2858
|
collection: this._collection,
|
|
2787
2859
|
op: "add",
|
|
2788
2860
|
payload: t,
|
|
@@ -2809,8 +2881,8 @@ var oe = class {
|
|
|
2809
2881
|
}]), { ok: true, id: i };
|
|
2810
2882
|
}
|
|
2811
2883
|
async set(e, t) {
|
|
2812
|
-
|
|
2813
|
-
let n = await this._store.getDoc(this._collection, e), o = t, i =
|
|
2884
|
+
L(e);
|
|
2885
|
+
let n = await this._store.getDoc(this._collection, e), o = t, i = k(o, void 0), s = await this._queue.enqueue({
|
|
2814
2886
|
collection: this._collection,
|
|
2815
2887
|
docId: e,
|
|
2816
2888
|
op: "set",
|
|
@@ -2838,8 +2910,8 @@ var oe = class {
|
|
|
2838
2910
|
}]), { ok: true };
|
|
2839
2911
|
}
|
|
2840
2912
|
async update(e, t, n) {
|
|
2841
|
-
|
|
2842
|
-
let o = await this._store.getDoc(this._collection, e), i = t, s = o?.meta.deleted ? void 0 : o?.data, a =
|
|
2913
|
+
L(e);
|
|
2914
|
+
let o = await this._store.getDoc(this._collection, e), i = t, s = o?.meta.deleted ? void 0 : o?.data, a = k(i, s), c = o?.meta.deleted ? { ...a } : { ...o?.data ?? {}, ...a }, l = await this._queue.enqueue({
|
|
2843
2915
|
collection: this._collection,
|
|
2844
2916
|
docId: e,
|
|
2845
2917
|
op: "update",
|
|
@@ -2872,7 +2944,7 @@ var oe = class {
|
|
|
2872
2944
|
}]), { ok: true };
|
|
2873
2945
|
}
|
|
2874
2946
|
async remove(e) {
|
|
2875
|
-
|
|
2947
|
+
L(e);
|
|
2876
2948
|
let t = await this._store.getDoc(this._collection, e);
|
|
2877
2949
|
return !t || t.meta.deleted, await this._queue.enqueue({
|
|
2878
2950
|
collection: this._collection,
|
|
@@ -2892,7 +2964,7 @@ var oe = class {
|
|
|
2892
2964
|
for (let o of e) {
|
|
2893
2965
|
let i = this._collection;
|
|
2894
2966
|
if (o.kind === "add") {
|
|
2895
|
-
let s = o.data, a =
|
|
2967
|
+
let s = o.data, a = k(s, void 0), c = await this._queue.enqueue({
|
|
2896
2968
|
collection: i,
|
|
2897
2969
|
op: "add",
|
|
2898
2970
|
payload: s,
|
|
@@ -2914,7 +2986,7 @@ var oe = class {
|
|
|
2914
2986
|
}
|
|
2915
2987
|
}), n.push({ type: "added", collection: i, doc: { id: l, data: a } });
|
|
2916
2988
|
} else if (o.kind === "set") {
|
|
2917
|
-
let s = o.id, a = o.data, c = await this._store.getDoc(i, s), l =
|
|
2989
|
+
let s = o.id, a = o.data, c = await this._store.getDoc(i, s), l = k(a, void 0), d = await this._queue.enqueue({
|
|
2918
2990
|
collection: i,
|
|
2919
2991
|
docId: s,
|
|
2920
2992
|
op: "set",
|
|
@@ -2941,7 +3013,7 @@ var oe = class {
|
|
|
2941
3013
|
doc: { id: s, data: l }
|
|
2942
3014
|
});
|
|
2943
3015
|
} else if (o.kind === "update") {
|
|
2944
|
-
let s = o.id, a = o.data, c = await this._store.getDoc(i, s), l = c?.meta.deleted ? void 0 : c?.data, d =
|
|
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 }, f = await this._queue.enqueue({
|
|
2945
3017
|
collection: i,
|
|
2946
3018
|
docId: s,
|
|
2947
3019
|
op: "update",
|
|
@@ -2984,7 +3056,7 @@ var oe = class {
|
|
|
2984
3056
|
}
|
|
2985
3057
|
// ── Realtime ─────────────────────────────────────────────────────────────────
|
|
2986
3058
|
onDoc(e, t) {
|
|
2987
|
-
return
|
|
3059
|
+
return L(e), this._buildGetResult(e).then((n) => {
|
|
2988
3060
|
t(n ? n.docs[0]?.data ?? null : null);
|
|
2989
3061
|
}).catch(() => t(null)), this._bus.subscribe(this._collection, (n) => {
|
|
2990
3062
|
let o = n.find((i) => i.doc.id === e);
|
|
@@ -3043,7 +3115,7 @@ var oe = class {
|
|
|
3043
3115
|
};
|
|
3044
3116
|
}
|
|
3045
3117
|
doc(e) {
|
|
3046
|
-
|
|
3118
|
+
L(e);
|
|
3047
3119
|
let t = this;
|
|
3048
3120
|
return {
|
|
3049
3121
|
get id() {
|
|
@@ -3106,7 +3178,7 @@ var oe = class {
|
|
|
3106
3178
|
this._store = e.store, this._queue = e.queue, this._bus = e.bus, this._engine = e.engine, this._connectivity = e.connectivity;
|
|
3107
3179
|
}
|
|
3108
3180
|
collection(e) {
|
|
3109
|
-
return
|
|
3181
|
+
return mt(e), new oe(
|
|
3110
3182
|
e,
|
|
3111
3183
|
this._store,
|
|
3112
3184
|
this._queue,
|
|
@@ -3135,10 +3207,10 @@ var oe = class {
|
|
|
3135
3207
|
return this._engine.onError(e);
|
|
3136
3208
|
}
|
|
3137
3209
|
};
|
|
3138
|
-
async function
|
|
3139
|
-
let e =
|
|
3210
|
+
async function we(r) {
|
|
3211
|
+
let e = ht() ? new Q() : new j(r.dbName);
|
|
3140
3212
|
await e.open();
|
|
3141
|
-
let t = new
|
|
3213
|
+
let t = new z(e), n = new H(), o = new G(), i = new X({
|
|
3142
3214
|
// Se startOnline=false, injeta um navigator falso
|
|
3143
3215
|
navigator: r.startOnline === false ? { onLine: false } : typeof navigator < "u" ? navigator : void 0
|
|
3144
3216
|
}), s = r.singleTab ? (
|
|
@@ -3151,7 +3223,7 @@ async function ve(r) {
|
|
|
3151
3223
|
) : new q({
|
|
3152
3224
|
lockName: `neetru-offline:${r.dbName}`,
|
|
3153
3225
|
channelName: `neetru-offline:${r.dbName}`
|
|
3154
|
-
}), a = new
|
|
3226
|
+
}), a = new K({
|
|
3155
3227
|
store: e,
|
|
3156
3228
|
queue: t,
|
|
3157
3229
|
resolver: n,
|
|
@@ -3171,9 +3243,9 @@ async function ve(r) {
|
|
|
3171
3243
|
}
|
|
3172
3244
|
|
|
3173
3245
|
// src/db/realtime/realtime-client.ts
|
|
3174
|
-
var
|
|
3175
|
-
function
|
|
3176
|
-
return typeof globalThis.crypto?.randomUUID == "function" ? globalThis.crypto.randomUUID() : `nrt-sub-${Date.now()}-${++
|
|
3246
|
+
var gt = 0;
|
|
3247
|
+
function Se() {
|
|
3248
|
+
return typeof globalThis.crypto?.randomUUID == "function" ? globalThis.crypto.randomUUID() : `nrt-sub-${Date.now()}-${++gt}-${Math.random().toString(36).slice(2)}`;
|
|
3177
3249
|
}
|
|
3178
3250
|
var F = class {
|
|
3179
3251
|
// ── configuração ──────────────────────────────────────────────────────────
|
|
@@ -3213,7 +3285,7 @@ var F = class {
|
|
|
3213
3285
|
_pendingFrames = [];
|
|
3214
3286
|
// ── construtor ────────────────────────────────────────────────────────────
|
|
3215
3287
|
constructor(e) {
|
|
3216
|
-
this._gatewayUrl = e.gatewayUrl, this._wsFactory = e.webSocketFactory ??
|
|
3288
|
+
this._gatewayUrl = e.gatewayUrl, this._wsFactory = e.webSocketFactory ?? bt, 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();
|
|
3217
3289
|
}
|
|
3218
3290
|
// ── API pública ───────────────────────────────────────────────────────────
|
|
3219
3291
|
/**
|
|
@@ -3227,8 +3299,8 @@ var F = class {
|
|
|
3227
3299
|
*/
|
|
3228
3300
|
subscribe(e, t, n) {
|
|
3229
3301
|
if (this._closed)
|
|
3230
|
-
return
|
|
3231
|
-
let o =
|
|
3302
|
+
return Se();
|
|
3303
|
+
let o = Se();
|
|
3232
3304
|
this._subscriptions.set(o, {
|
|
3233
3305
|
subscriptionId: o,
|
|
3234
3306
|
collection: e,
|
|
@@ -3492,7 +3564,7 @@ var F = class {
|
|
|
3492
3564
|
_detachHandlers(e) {
|
|
3493
3565
|
e.onopen = null, e.onmessage = null, e.onclose = null, e.onerror = null;
|
|
3494
3566
|
}
|
|
3495
|
-
},
|
|
3567
|
+
}, bt = (r) => {
|
|
3496
3568
|
if (typeof WebSocket > "u")
|
|
3497
3569
|
throw new Error(
|
|
3498
3570
|
"[NeetruRealtimeClient] WebSocket n\xE3o dispon\xEDvel neste ambiente. Injete uma implementa\xE7\xE3o via `webSocketFactory` nas op\xE7\xF5es."
|
|
@@ -3501,12 +3573,12 @@ var F = class {
|
|
|
3501
3573
|
};
|
|
3502
3574
|
|
|
3503
3575
|
// src/db/client-db.ts
|
|
3504
|
-
|
|
3505
|
-
var
|
|
3506
|
-
function
|
|
3507
|
-
return e._transport ? e._transport : r === "firestore" && e.firestoreTransport ? e.firestoreTransport : r === "nosql-vm" && e.realtimeGatewayUrl ?
|
|
3576
|
+
I();
|
|
3577
|
+
var Vt = (r) => `/api/sdk/v1/datastore/${encodeURIComponent(r)}`, Y = (r, e) => `/api/sdk/v1/datastore/${encodeURIComponent(r)}/${encodeURIComponent(e)}`, Ge = 200;
|
|
3578
|
+
function jt(r, e, t) {
|
|
3579
|
+
return e._transport ? e._transport : r === "firestore" && e.firestoreTransport ? e.firestoreTransport : r === "nosql-vm" && e.realtimeGatewayUrl ? Qt(e.realtimeGatewayUrl, t, e) : Xe(t);
|
|
3508
3580
|
}
|
|
3509
|
-
function
|
|
3581
|
+
function Xe(r) {
|
|
3510
3582
|
return {
|
|
3511
3583
|
async pushMutations(e) {
|
|
3512
3584
|
if (!r)
|
|
@@ -3584,7 +3656,7 @@ function je(r) {
|
|
|
3584
3656
|
try {
|
|
3585
3657
|
l = await t(r, {
|
|
3586
3658
|
method: "GET",
|
|
3587
|
-
path:
|
|
3659
|
+
path: Vt(c),
|
|
3588
3660
|
requireAuth: !0,
|
|
3589
3661
|
retries: 2,
|
|
3590
3662
|
headers: o,
|
|
@@ -3592,37 +3664,37 @@ function je(r) {
|
|
|
3592
3664
|
// TRUNCADAS — reportadas em `truncatedCollections` p/ o SyncEngine
|
|
3593
3665
|
// (a) NÃO rodar deleção-por-ausência e (b) sinalizar
|
|
3594
3666
|
// `DbListResult.truncated`. Paginação por cursor é tarefa Core (gated).
|
|
3595
|
-
query: { limit:
|
|
3667
|
+
query: { limit: Ge }
|
|
3596
3668
|
});
|
|
3597
3669
|
} catch (f) {
|
|
3598
|
-
let
|
|
3670
|
+
let h = f instanceof Error ? f.message : String(f);
|
|
3599
3671
|
throw new exports.NeetruDbError(
|
|
3600
3672
|
"db_unavailable",
|
|
3601
|
-
`[RestSyncTransport] fullResync falhou na cole\xE7\xE3o "${c}": ${
|
|
3673
|
+
`[RestSyncTransport] fullResync falhou na cole\xE7\xE3o "${c}": ${h}`
|
|
3602
3674
|
);
|
|
3603
3675
|
}
|
|
3604
3676
|
let d = l, u = Array.isArray(d?.items) ? d.items : [];
|
|
3605
|
-
u.length >=
|
|
3677
|
+
u.length >= Ge && a.push(c);
|
|
3606
3678
|
for (let f of u) {
|
|
3607
3679
|
if (!f || typeof f != "object") continue;
|
|
3608
|
-
let
|
|
3609
|
-
if (!
|
|
3610
|
-
let { id:
|
|
3611
|
-
if (typeof
|
|
3612
|
-
|
|
3613
|
-
else if (
|
|
3614
|
-
|
|
3615
|
-
else if (typeof
|
|
3616
|
-
let
|
|
3617
|
-
Number.isNaN(
|
|
3680
|
+
let h = f, v = typeof h.id == "string" ? h.id : null;
|
|
3681
|
+
if (!v) continue;
|
|
3682
|
+
let { id: _, ...B } = h, y = i, b = B._updatedAt;
|
|
3683
|
+
if (typeof b == "number")
|
|
3684
|
+
y = b;
|
|
3685
|
+
else if (b !== null && typeof b == "object" && typeof b._seconds == "number")
|
|
3686
|
+
y = b._seconds * 1e3;
|
|
3687
|
+
else if (typeof b == "string") {
|
|
3688
|
+
let C = Date.parse(b);
|
|
3689
|
+
Number.isNaN(C) || (y = C);
|
|
3618
3690
|
}
|
|
3619
|
-
let
|
|
3691
|
+
let w = `rest_${v}_${y}`;
|
|
3620
3692
|
s.push({
|
|
3621
3693
|
collection: c,
|
|
3622
|
-
id:
|
|
3623
|
-
data:
|
|
3624
|
-
serverVersion:
|
|
3625
|
-
serverTimestamp:
|
|
3694
|
+
id: v,
|
|
3695
|
+
data: B,
|
|
3696
|
+
serverVersion: w,
|
|
3697
|
+
serverTimestamp: y,
|
|
3626
3698
|
deleted: false
|
|
3627
3699
|
});
|
|
3628
3700
|
}
|
|
@@ -3631,10 +3703,10 @@ function je(r) {
|
|
|
3631
3703
|
}
|
|
3632
3704
|
};
|
|
3633
3705
|
}
|
|
3634
|
-
function
|
|
3635
|
-
let n =
|
|
3706
|
+
function Qt(r, e, t) {
|
|
3707
|
+
let n = Xe(e), o = new F({
|
|
3636
3708
|
gatewayUrl: r,
|
|
3637
|
-
ticketProvider:
|
|
3709
|
+
ticketProvider: zt(e, t),
|
|
3638
3710
|
dbId: t.dbId,
|
|
3639
3711
|
webSocketFactory: t._wsFactory
|
|
3640
3712
|
});
|
|
@@ -3670,7 +3742,7 @@ function At(r, e, t) {
|
|
|
3670
3742
|
}
|
|
3671
3743
|
};
|
|
3672
3744
|
}
|
|
3673
|
-
function
|
|
3745
|
+
function zt(r, e) {
|
|
3674
3746
|
return async () => {
|
|
3675
3747
|
let { httpRequest: t } = await Promise.resolve().then(() => (W(), U));
|
|
3676
3748
|
return await t(r, {
|
|
@@ -3685,27 +3757,27 @@ function Nt(r, e) {
|
|
|
3685
3757
|
});
|
|
3686
3758
|
};
|
|
3687
3759
|
}
|
|
3688
|
-
function
|
|
3760
|
+
function zn(r, e, t, n) {
|
|
3689
3761
|
return new F({ gatewayUrl: r, ticketProvider: e, dbId: t, webSocketFactory: n });
|
|
3690
3762
|
}
|
|
3691
3763
|
var pe = false;
|
|
3692
|
-
function
|
|
3764
|
+
function Kn() {
|
|
3693
3765
|
pe = false;
|
|
3694
3766
|
}
|
|
3695
|
-
function
|
|
3767
|
+
function Kt(r, e) {
|
|
3696
3768
|
pe || e.dbId && r.env !== "prod" && (typeof window > "u" || typeof console > "u" || typeof console.warn != "function" || (pe = true, console.warn(
|
|
3697
3769
|
'[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.'
|
|
3698
3770
|
)));
|
|
3699
3771
|
}
|
|
3700
|
-
function
|
|
3701
|
-
|
|
3772
|
+
function Hn(r, e = {}) {
|
|
3773
|
+
Kt(r, e);
|
|
3702
3774
|
let t;
|
|
3703
3775
|
e.transport !== void 0 ? t = e.transport : e.engine !== void 0 ? (console.warn(
|
|
3704
3776
|
'[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).'
|
|
3705
3777
|
), t = e.engine) : t = "rest";
|
|
3706
|
-
let n =
|
|
3778
|
+
let n = jt(t, e, r), o = e.dbId ?? "default", i = e.dbName ?? `neetru-db__${r.productId ?? "sdk"}__${o}__${r.env}`, s = null, a = null;
|
|
3707
3779
|
function c() {
|
|
3708
|
-
return s || (s =
|
|
3780
|
+
return s || (s = we({
|
|
3709
3781
|
dbName: i,
|
|
3710
3782
|
transport: n,
|
|
3711
3783
|
singleTab: e.singleTab ?? r.env !== "prod"
|
|
@@ -3713,7 +3785,7 @@ function xn(r, e = {}) {
|
|
|
3713
3785
|
}
|
|
3714
3786
|
return {
|
|
3715
3787
|
collection(l) {
|
|
3716
|
-
return a ? a.collection(l) :
|
|
3788
|
+
return a ? a.collection(l) : Ht(l, c);
|
|
3717
3789
|
},
|
|
3718
3790
|
async sql(l, d) {
|
|
3719
3791
|
if (r.env === "dev")
|
|
@@ -3721,7 +3793,7 @@ function xn(r, e = {}) {
|
|
|
3721
3793
|
"db_unavailable",
|
|
3722
3794
|
"[SDK] db.sql() n\xE3o dispon\xEDvel em NEETRU_ENV=dev. Use `neetru dev` para subir o container Postgres local."
|
|
3723
3795
|
);
|
|
3724
|
-
return (await Promise.resolve().then(() => (
|
|
3796
|
+
return (await Promise.resolve().then(() => (He(), Ke))).createSqlClientFromConfig(r, l, d);
|
|
3725
3797
|
},
|
|
3726
3798
|
get syncState() {
|
|
3727
3799
|
return a?.syncState ?? {
|
|
@@ -3760,7 +3832,7 @@ function xn(r, e = {}) {
|
|
|
3760
3832
|
}
|
|
3761
3833
|
};
|
|
3762
3834
|
}
|
|
3763
|
-
function
|
|
3835
|
+
function Ht(r, e) {
|
|
3764
3836
|
async function t() {
|
|
3765
3837
|
return (await e()).collection(r);
|
|
3766
3838
|
}
|
|
@@ -3839,12 +3911,12 @@ function Ft(r, e) {
|
|
|
3839
3911
|
}
|
|
3840
3912
|
|
|
3841
3913
|
exports.NEETRU_SENTINEL_KEY = te;
|
|
3842
|
-
exports.__resetDbIdWarningForTests =
|
|
3843
|
-
exports.createNeetruDb =
|
|
3844
|
-
exports.createRestSyncTransport =
|
|
3845
|
-
exports.getWebSocketRealtimeClient =
|
|
3846
|
-
exports.increment =
|
|
3847
|
-
exports.isFieldSentinel =
|
|
3848
|
-
exports.isIncrementSentinel =
|
|
3849
|
-
exports.isServerTimestampSentinel =
|
|
3850
|
-
exports.serverTimestamp =
|
|
3914
|
+
exports.__resetDbIdWarningForTests = Kn;
|
|
3915
|
+
exports.createNeetruDb = Hn;
|
|
3916
|
+
exports.createRestSyncTransport = Xe;
|
|
3917
|
+
exports.getWebSocketRealtimeClient = zn;
|
|
3918
|
+
exports.increment = st;
|
|
3919
|
+
exports.isFieldSentinel = D;
|
|
3920
|
+
exports.isIncrementSentinel = ge;
|
|
3921
|
+
exports.isServerTimestampSentinel = ye;
|
|
3922
|
+
exports.serverTimestamp = it;
|