@neetru/sdk 3.4.1 → 3.4.3

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 CHANGED
@@ -5,6 +5,35 @@ All notable changes to `@neetru/sdk` will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.4.3] - 2026-09-07 — **build-guard força pg + drizzle-orm no trace do standalone (causa-2 outage PDV 2026-09-07)**
9
+
10
+ Release **patch** (só correção de build; nada de wire, nada removido da API). Fase 2 do conserto do outage do PDV.
11
+
12
+ ### Corrigido
13
+
14
+ - **`withNeetruBuildGuard` força o FECHO TRANSITIVO de `pg` + `drizzle-orm` no trace do `output: 'standalone'`** — `client.db.sql` carrega `pg` e `drizzle-orm/node-postgres` por `import()` dinâmico com `webpackIgnore` (server-only, pra `pg` nunca vazar `fs`/`tls`/`net` pro bundle do browser). O efeito colateral era invisível: o trace estático do Next (`@vercel/nft`) não enxerga esses `import()`, então num standalone enxuto `pg` e todo o closure dele **não eram copiados** pra `.next/standalone/node_modules` → runtime `Cannot find package 'pg'` (e, depois de forçar só o dir do `pg`, `Cannot find module 'postgres-array'`). Causa-2 do outage do PDV de 2026-09-07. O guard agora injeta duas chaves no `next.config`:
15
+ - `outputFileTracingIncludes: { '*': [...closure] }` **(o conserto real)** — computa PROGRAMATICAMENTE o fecho transitivo de runtime de `pg` + `drizzle-orm` a partir do node_modules instalado do produto e emite um glob `./node_modules/<pkg>/**` por pacote do closure: `pg → pg-pool/pg-protocol/pg-types/pg-connection-string/pgpass → postgres-array/postgres-bytea/postgres-date/postgres-interval/pg-int8 → …` (+ optional `pg-cloudflare`). O walker lê `package.json` **direto do filesystem** (não `require.resolve`, que dá `ERR_PACKAGE_PATH_NOT_EXPORTED` em pacotes com `exports` fechando `./package.json` — `drizzle-orm`/`pg-protocol`/`pg-pool` fazem isso), com poda de ciclo e skip gracioso de dep faltando. Chave `'*'` casa todas as rotas.
16
+ - `serverExternalPackages: [...existentes, 'pg', 'drizzle-orm']` **(reforço)** — inofensivo e ajuda caminhos de import VISÍVEIS ao nft, mas **NÃO conserta** o caso `webpackIgnore` (o `import()` é invisível ao nft, então `serverExternalPackages` sozinho não copia `pg` nem o closure — por isso o glob computado é o que resolve).
17
+
18
+ Ambas MESCLAM (concat + dedupe) com o que o produto já tiver — nunca sobrescrevem. Só o caminho de produção (`pg` + `drizzle-orm`); `pglite`/`pg-mem` (mock/teste) NÃO entram. Produto **sem SQL**: `pg`/`drizzle-orm` não resolvem → closure `[]` → nenhuma chave adicionada → **zero peso morto**. Programático (não glob fixo) DE PROPÓSITO: os transitivos ficam HOISTADOS na raiz (npm 7+), então `./node_modules/pg/**` sozinho não os cobre — à prova de whack-a-mole. Chaves canônicas do Next 15 (todo o ecossistema Neetru). Roda no BUILD do produto, não em runtime. Verificado contra o artefato ESM buildado: closure de 15 pacotes, `./node_modules/postgres-array/**` presente.
19
+
20
+ ### Manutenção
21
+
22
+ - **Sincroniza `VERSION` (`src/index.ts`) com `package.json`** — a release 3.4.2 bumpou o `package.json` mas esqueceu a const `VERSION` (ficou em `3.4.1`), o que reprovava o drift-guard (`version-and-export-surface`). Realinhado em `3.4.3`.
23
+
24
+ ## [3.4.2] - 2026-09-06 — **barra de conta (app-switcher) + build-guard OIDC de PROD + pool SQL tunável**
25
+
26
+ Release **patch** (tudo aditivo/retrocompatível: nova superfície opcional, guard só-prod, tuning de pool). Nenhuma mudança de wire, nenhuma remoção de API.
27
+
28
+ ### Adicionado
29
+
30
+ - **Barra de conta / app-switcher** (#17) — superfície `account-bar` que dá ao produto uma barra canônica de identidade + troca de app sem cada produto reinventar. Aditiva e opcional.
31
+ - **Build-guard de PROD** (#18) — `assertNeetruProdBuildEnv` **falha o build de produção** (`builtEnv === 'prod'`) quando `oidcClientId`/`productId` vêm em branco, transformando o incidente do gestovendas (env var OIDC vazia chegando em prod) em erro de build, não de runtime. Só-prod: dev/test/preview passam inalterados (sem falso-positivo).
32
+
33
+ ### Alterado (performance)
34
+
35
+ - **Pool SQL** (#19) — `client.db.sql` (`pg.Pool`): `max` 3→10, `idleTimeout` 30s→60s, `keepAlive` ligado; tunável por `NEETRU_DB_POOL_MAX` / `NEETRU_DB_POOL_IDLE_MS` via `resolvePoolTuning()`. Endereça a lentidão de conexão DB↔app observada no PDV sob carga (o teto de 3 conexões serializava as queries).
36
+
8
37
  ## [3.4.1] - 2026-08-20 — **fix(db offline): resiliência da fila offline + honestidade do transporte Documentos**
9
38
 
10
39
  Release **patch** (correção de resiliência + aditivos opcionais retrocompatíveis; nenhuma mudança de wire, nenhuma remoção de API). Camada offline `client.db` (Mundo Documentos).
package/dist/auth.cjs CHANGED
@@ -684,13 +684,17 @@ var init_lease = __esm({
684
684
  // src/db/sql/sql-client.ts
685
685
  var sql_client_exports = {};
686
686
  __export(sql_client_exports, {
687
+ DEFAULT_POOL_CONNECT_TIMEOUT_MS: () => DEFAULT_POOL_CONNECT_TIMEOUT_MS,
688
+ DEFAULT_POOL_IDLE_MS: () => DEFAULT_POOL_IDLE_MS,
689
+ DEFAULT_POOL_MAX: () => DEFAULT_POOL_MAX,
687
690
  LEASE_ENDPOINT: () => LEASE_ENDPOINT,
688
691
  LEASE_RENEW_ENDPOINT: () => LEASE_RENEW_ENDPOINT,
689
692
  createDrizzleHandle: () => createDrizzleHandle,
690
693
  createHttpLeaseFetcher: () => createHttpLeaseFetcher,
691
694
  createPgPool: () => createPgPool,
692
695
  createSqlClientFromConfig: () => createSqlClientFromConfig,
693
- createSqlClientWithDeps: () => createSqlClientWithDeps
696
+ createSqlClientWithDeps: () => createSqlClientWithDeps,
697
+ resolvePoolTuning: () => resolvePoolTuning
694
698
  });
695
699
  function mapEnvToCore(sdkEnv) {
696
700
  if (sdkEnv === "workspace") return "staging";
@@ -779,6 +783,30 @@ function parseLease(raw) {
779
783
  expiresAt: req("expiresAt", "string")
780
784
  };
781
785
  }
786
+ function readEnvInt(name, def, min, max) {
787
+ const raw = typeof process !== "undefined" ? process.env?.[name] : void 0;
788
+ if (raw === void 0 || raw.trim() === "") return def;
789
+ const n = Number.parseInt(raw.trim(), 10);
790
+ if (!Number.isFinite(n) || n < min || n > max) return def;
791
+ return n;
792
+ }
793
+ function resolvePoolTuning() {
794
+ return {
795
+ // Teto 100: bem abaixo do `max_client_conn = 500` do PgBouncer, com folga
796
+ // para múltiplas instâncias do app dividirem o mesmo front-door.
797
+ max: readEnvInt("NEETRU_DB_POOL_MAX", DEFAULT_POOL_MAX, 1, 100),
798
+ // Teto 15min = janela do cert; piso 1s.
799
+ idleTimeoutMillis: readEnvInt("NEETRU_DB_POOL_IDLE_MS", DEFAULT_POOL_IDLE_MS, 1e3, 9e5),
800
+ connectionTimeoutMillis: readEnvInt(
801
+ "NEETRU_DB_POOL_CONNECT_TIMEOUT_MS",
802
+ DEFAULT_POOL_CONNECT_TIMEOUT_MS,
803
+ 1e3,
804
+ 12e4
805
+ ),
806
+ keepAlive: true,
807
+ keepAliveInitialDelayMillis: 1e4
808
+ };
809
+ }
782
810
  async function createPgPool(lease) {
783
811
  const { Pool } = await import(
784
812
  /* webpackIgnore: true */
@@ -797,9 +825,7 @@ async function createPgPool(lease) {
797
825
  user: lease.user,
798
826
  password: lease.password,
799
827
  ssl,
800
- max: 3,
801
- idleTimeoutMillis: 3e4,
802
- connectionTimeoutMillis: 1e4
828
+ ...resolvePoolTuning()
803
829
  });
804
830
  }
805
831
  async function createDrizzleHandle(pool, schema) {
@@ -934,9 +960,9 @@ async function createSqlClientFromConfig(config, schema, options) {
934
960
  user: lease.user,
935
961
  password: lease.password,
936
962
  ssl,
937
- max: 3,
938
- idleTimeoutMillis: 3e4,
939
- connectionTimeoutMillis: 1e4
963
+ // Tuning centralizado (env-tunável) — ver resolvePoolTuning + auditoria
964
+ // docs/_review/AUDITORIA_DB_CONN_PERF_2026-09-06.md no Core.
965
+ ...resolvePoolTuning()
940
966
  });
941
967
  };
942
968
  const createDrizzle = (pool, s) => {
@@ -959,7 +985,7 @@ async function createSqlClientFromConfig(config, schema, options) {
959
985
  options
960
986
  );
961
987
  }
962
- var LEASE_ENDPOINT, LEASE_RENEW_ENDPOINT;
988
+ var LEASE_ENDPOINT, LEASE_RENEW_ENDPOINT, DEFAULT_POOL_MAX, DEFAULT_POOL_IDLE_MS, DEFAULT_POOL_CONNECT_TIMEOUT_MS;
963
989
  var init_sql_client = __esm({
964
990
  "src/db/sql/sql-client.ts"() {
965
991
  init_db_errors();
@@ -968,6 +994,9 @@ var init_sql_client = __esm({
968
994
  init_resilient_pool();
969
995
  LEASE_ENDPOINT = "/api/sdk/v1/db/lease";
970
996
  LEASE_RENEW_ENDPOINT = "/api/sdk/v1/db/lease/renew";
997
+ DEFAULT_POOL_MAX = 10;
998
+ DEFAULT_POOL_IDLE_MS = 6e4;
999
+ DEFAULT_POOL_CONNECT_TIMEOUT_MS = 1e4;
971
1000
  }
972
1001
  });
973
1002