@mybuildex/pkg 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -51,6 +51,18 @@ createAuthMiddleware({
51
51
  createTenantMiddleware({getTenantClient, defaultClient, strictTenant: true});
52
52
  ```
53
53
 
54
+ ## 0.6.0 — segurança e confiabilidade
55
+
56
+ Correções em módulos existentes. **Três mudam comportamento por padrão** (marcadas com ⚠️) — conferir antes de atualizar uma API.
57
+
58
+ - **Bypass de autenticação fechado** — `createAuthMiddleware` decide rota pública (e rota do `internalAuth`) sobre o caminho que o roteador do Fastify escolheu, não mais sobre a URL crua. Antes, `GET /v1/1/users;/webhook` (regex pública sem âncora) e `/v1/1/x/%61dmin/...` (lookahead furado por `%xx`) executavam a rota protegida sem token, e `POST /rota-protegida;/emailsend` aceitava o segredo interno fora da lista. `canonicalRequestPath(request)` é exportado.
59
+ - ⚠️ **Teto de execução de SQL** — `createMultitenantPrisma` aplica `max_execution_time` (MySQL) em toda conexão do pool: default 60000 ms. Precedência: opção `statementTimeoutMs` > env `DB_STATEMENT_TIMEOUT_MS` > 60000; `0` desliga. O Prisma não cancela a consulta quando o cliente HTTP desiste — sem o teto, um SELECT pesado segue rodando no banco. **Relatórios que passam de 60 s precisam subir o valor.** `resolveStatementTimeout` é exportado.
60
+ - ⚠️ **Instância envenenada morre** — o Fastify guarda o erro do primeiro `ready()` e nunca re-tenta o boot no mesmo processo. `createGcfHandler` agora responde o 503 (com CORS) e, depois que a resposta é escrita, sai com `exit(1)` para o Cloud Run trocar a instância. Opções: `exitOnBootFailure` (default `true`), `exitDelayMs` (default 2000, rede de segurança), `exit` (injetável).
61
+ - ⚠️ **`createSharedSecretGuard` em Cloud Run/Functions** — produção agora é `NODE_ENV === "production"` **ou** `K_SERVICE` presente. Sem isso, `allowMissingInDev: true` abria a rota interna em produção quando o deploy não define `NODE_ENV`.
62
+ - `createCompressPlugin()` e `createAsyncSendGuard()` funcionam também via `fastify.register(...)` (antes só chamando como função — via `register` nada era comprimido).
63
+ - `requestScoped`: fora de request, `then` e símbolos devolvem `undefined` — `await` acidental, `console.log` e `util.inspect` no proxy não lançam mais. Uso real do service fora de request continua lançando `RequestScopeError`.
64
+ - `withTenantSchema` marcado `@deprecated`: com `@prisma/adapter-mariadb` todo raw roda como prepared statement e o `USE` falha (Error 1295). Alternativas no cabeçalho de `src/prisma/raw-tenant.ts`.
65
+
54
66
  ## Consumo pelas APIs (npmjs público)
55
67
 
56
68
  O pacote é publicado **público no npmjs** — só o `dist/` compilado vai no tarball (`files: ["dist"]`); testes e repo continuam privados. Zero token: `npm i` funciona no dev, no Actions e no build do GCP.
@@ -22,17 +22,27 @@ exports.createCompressPlugin = createCompressPlugin;
22
22
  // documentação do Fastify manda fazer) — sem tocar nas centenas de rotas.
23
23
  //
24
24
  // Registrar em loadPlugins logo após o CORS, antes dos controllers (o guard é
25
- // um hook onRoute: só cobre rotas registradas depois dele).
25
+ // um hook onRoute: só cobre rotas registradas depois dele). Funciona chamando
26
+ // como função (`await createCompressPlugin()(fastify)`) ou via
27
+ // `fastify.register(createCompressPlugin())`.
26
28
  const compress_1 = __importDefault(require("@fastify/compress"));
27
29
  const node_zlib_1 = require("node:zlib");
28
30
  const GUARD_INSTALLED = Symbol.for("@mybuildex/pkg/async-send-guard");
29
31
  const COMPRESS_INSTALLED = Symbol.for("@mybuildex/pkg/compress-installed");
30
32
  const SEND_CALLED = Symbol("@mybuildex/pkg/send-called");
33
+ /** Marca o plugin para o Fastify NÃO encapsulá-lo (o que o fastify-plugin
34
+ * faz, sem a dependência). Sem isto, via `fastify.register(plugin)` o hook
35
+ * onRoute e o @fastify/compress ficariam presos no contexto filho e não
36
+ * cobririam as rotas da API — só funcionava chamando como função. */
37
+ function skipOverride(plugin) {
38
+ plugin[Symbol.for("skip-override")] = true;
39
+ return plugin;
40
+ }
31
41
  /** Guard isolado (também exportado para teste): torna `reply.send` sem return
32
42
  * em handler async equivalente a `return reply`. Rotas síncronas, hijack,
33
43
  * 204 sem corpo e erros não são afetados. */
34
44
  function createAsyncSendGuard() {
35
- return async function asyncSendGuard(fastify) {
45
+ return skipOverride(async function asyncSendGuard(fastify) {
36
46
  if (fastify[GUARD_INSTALLED])
37
47
  return;
38
48
  fastify[GUARD_INSTALLED] = true;
@@ -53,12 +63,12 @@ function createAsyncSendGuard() {
53
63
  return result;
54
64
  };
55
65
  });
56
- };
66
+ });
57
67
  }
58
68
  function createCompressPlugin(options = {}) {
59
69
  const { threshold = 1024, encodings = ["br", "gzip", "deflate"], brotliQuality = 4, level } = options;
60
70
  const guard = createAsyncSendGuard();
61
- return async function compressPlugin(fastify) {
71
+ const compressPlugin = async function compressPlugin(fastify) {
62
72
  await guard(fastify);
63
73
  if (fastify[COMPRESS_INSTALLED])
64
74
  return;
@@ -71,5 +81,6 @@ function createCompressPlugin(options = {}) {
71
81
  ...(level !== undefined ? { zlibOptions: { level } } : {}),
72
82
  });
73
83
  };
84
+ return skipOverride(compressPlugin);
74
85
  }
75
86
  //# sourceMappingURL=compress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compress.js","sourceRoot":"","sources":["../../src/http/compress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../../src/http/compress.ts"],"names":[],"mappings":"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"}
@@ -16,5 +16,12 @@ export interface GcfHandlerOptions {
16
16
  bootFailureStatus?: number;
17
17
  /** Mensagem quando o boot falha (nunca expõe o erro cru ao cliente) */
18
18
  bootFailureMessage?: string;
19
+ /** Sair do processo (exit 1) depois de responder a falha de boot, para o
20
+ * Cloud Run trocar a instância envenenada (default: true). */
21
+ exitOnBootFailure?: boolean;
22
+ /** Rede de segurança caso `finish`/`close` não disparem (default: 2000ms) */
23
+ exitDelayMs?: number;
24
+ /** Função de saída (default: process.exit) — injetável para teste */
25
+ exit?: (code: number) => void;
19
26
  }
20
27
  export declare function createGcfHandler(options: GcfHandlerOptions): (req: any, res: any) => Promise<void>;
@@ -16,8 +16,14 @@
16
16
  // TRÊS GARANTIAS DESTE WRAPPER:
17
17
  // 1. O boot nunca gera unhandledRejection — o .catch() é anexado no mesmo tick
18
18
  // em que a promise é criada, e o ready() só dispara na primeira request.
19
- // 2. Falha de boot NÃO é cacheada: a próxima request re-tenta. Sem o reset, a
20
- // instância servia a MESMA promise rejeitada até morrer de velhice.
19
+ // 2. Instância envenenada não sobrevive. O avvio do Fastify GUARDA o erro do
20
+ // primeiro ready(): toda chamada seguinte rejeita na hora com o mesmo erro,
21
+ // sem re-executar os plugins (verificado no Fastify 4.29). Re-tentar no
22
+ // mesmo processo não adianta — a instância devolveria 503 em TODAS as
23
+ // requests até o Cloud Run reciclá-la. Por isso, depois de responder o 503,
24
+ // o processo sai (exitOnBootFailure, default true) e a próxima request cai
25
+ // numa instância limpa. O reset da promise continua para servidores cujo
26
+ // ready() de fato re-tenta.
21
27
  // 3. CORS em TODA resposta, inclusive 404 e falha de boot. O @fastify/cors é
22
28
  // registrado dentro do plugin `app`, que é encapsulado — então o handler de
23
29
  // 404 da RAIZ respondia sem Access-Control-Allow-Origin (verificado em
@@ -29,7 +35,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
35
  exports.createGcfHandler = createGcfHandler;
30
36
  const plugin_1 = require("../cors/plugin");
31
37
  function createGcfHandler(options) {
32
- const { server, origin = "*", methods = plugin_1.DEFAULT_CORS.methods.join(","), headers = "*", maxAge = "3600", handlePreflight = true, bootFailureStatus = 503, bootFailureMessage = "Serviço iniciando, tente novamente em instantes", } = options;
38
+ const { server, origin = "*", methods = plugin_1.DEFAULT_CORS.methods.join(","), headers = "*", maxAge = "3600", handlePreflight = true, bootFailureStatus = 503, bootFailureMessage = "Serviço iniciando, tente novamente em instantes", exitOnBootFailure = true, exitDelayMs = 2000, exit = (code) => process.exit(code), } = options;
33
39
  // null = ainda não bootou (ou o boot anterior falhou e será re-tentado)
34
40
  let readyPromise = null;
35
41
  function getReady() {
@@ -43,6 +49,28 @@ function createGcfHandler(options) {
43
49
  }
44
50
  return readyPromise;
45
51
  }
52
+ let exitScheduled = false;
53
+ // Sai só DEPOIS que a resposta foi escrita no socket: process.exit() no
54
+ // mesmo tick cortaria o 503 e o browser voltaria a ver "erro de CORS".
55
+ function scheduleExit(res) {
56
+ if (!exitOnBootFailure || exitScheduled)
57
+ return;
58
+ exitScheduled = true;
59
+ let exited = false;
60
+ const encerrar = () => {
61
+ if (exited)
62
+ return;
63
+ exited = true;
64
+ console.error("[gcf] encerrando a instância após falha de boot");
65
+ exit(1);
66
+ };
67
+ const seguranca = setTimeout(encerrar, exitDelayMs);
68
+ seguranca.unref?.();
69
+ if (typeof res?.once === "function") {
70
+ res.once("finish", encerrar);
71
+ res.once("close", encerrar);
72
+ }
73
+ }
46
74
  function applyCors(res) {
47
75
  if (typeof res?.setHeader !== "function")
48
76
  return;
@@ -72,6 +100,7 @@ function createGcfHandler(options) {
72
100
  res.statusCode = bootFailureStatus;
73
101
  res.setHeader?.("Content-Type", "application/json; charset=utf-8");
74
102
  res.setHeader?.("Retry-After", "1");
103
+ scheduleExit(res);
75
104
  res.end(JSON.stringify({ statusCode: bootFailureStatus, message: bootFailureMessage }));
76
105
  return;
77
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gcf-handler.js","sourceRoot":"","sources":["../../src/http/gcf-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gcf-handler.js","sourceRoot":"","sources":["../../src/http/gcf-handler.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,9 @@ export interface SharedSecretGuardOptions {
7
7
  query?: string;
8
8
  /** Sem a variável e fora de produção: liberar (default false) */
9
9
  allowMissingInDev?: boolean;
10
- /** Considerado produção quando true (default: NODE_ENV === "production") */
10
+ /** Considerado produção quando true (default: NODE_ENV === "production"
11
+ * ou K_SERVICE presente — Cloud Run/Functions nem sempre definem
12
+ * NODE_ENV, e sem isso `allowMissingInDev` abriria a rota em produção) */
11
13
  isProduction?: () => boolean;
12
14
  log?: (message: string) => void;
13
15
  }
@@ -13,7 +13,7 @@ function createSharedSecretGuard(options = {}) {
13
13
  const ENV = options.env ?? "INTERNAL_API_SECRET";
14
14
  const HEADER = (options.header ?? "x-internal-secret").toLowerCase();
15
15
  const QUERY = options.query;
16
- const isProduction = options.isProduction ?? (() => process.env.NODE_ENV === "production");
16
+ const isProduction = options.isProduction ?? (() => process.env.NODE_ENV === "production" || !!process.env.K_SERVICE);
17
17
  const log = options.log ?? ((m) => console.error(m));
18
18
  /** preHandler/onRequest do Fastify: `{preHandler: guard}` na rota interna */
19
19
  return async function sharedSecretGuard(request, reply) {
@@ -1 +1 @@
1
- {"version":3,"file":"shared-secret.js","sourceRoot":"","sources":["../../src/http/shared-secret.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,kEAAkE;AAClE,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,8CAA8C;;AAkB9C,0DAwBC;AAxCD,iDAAyC;AAgBzC,SAAgB,uBAAuB,CAAC,UAAoC,EAAE;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,qBAAqB,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC;IAC3F,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,6EAA6E;IAC7E,OAAO,KAAK,UAAU,iBAAiB,CAAC,OAAY,EAAE,KAAU;QAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,EAAE,IAAI,OAAO,CAAC,iBAAiB;gBAAE,OAAO;YACzD,GAAG,CAAC,4BAA4B,GAAG,qCAAqC,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,oDAAoD,EAAC,CAAC,CAAC;QACpH,CAAC;QAED,IAAI,QAAQ,GAAY,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK;YAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAA,wBAAS,EAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,0BAA0B,EAAC,CAAC,CAAC;QAC1F,CAAC;IACL,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"shared-secret.js","sourceRoot":"","sources":["../../src/http/shared-secret.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,kEAAkE;AAClE,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,8CAA8C;;AAoB9C,0DAwBC;AA1CD,iDAAyC;AAkBzC,SAAgB,uBAAuB,CAAC,UAAoC,EAAE;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,qBAAqB,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,6EAA6E;IAC7E,OAAO,KAAK,UAAU,iBAAiB,CAAC,OAAY,EAAE,KAAU;QAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,EAAE,IAAI,OAAO,CAAC,iBAAiB;gBAAE,OAAO;YACzD,GAAG,CAAC,4BAA4B,GAAG,qCAAqC,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,oDAAoD,EAAC,CAAC,CAAC;QACpH,CAAC;QAED,IAAI,QAAQ,GAAY,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK;YAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAA,wBAAS,EAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,0BAA0B,EAAC,CAAC,CAAC;QAC1F,CAAC;IACL,CAAC,CAAC;AACN,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { resolveTenantId, readRawTenantId } from "./tenant/resolve";
2
2
  export type { TenantRequestLike } from "./tenant/resolve";
3
3
  export { createTenantMiddleware, InvalidTenantError } from "./tenant/middleware";
4
4
  export type { TenantMiddlewareOptions } from "./tenant/middleware";
5
- export { createAuthMiddleware } from "./tenant/auth";
5
+ export { createAuthMiddleware, canonicalRequestPath } from "./tenant/auth";
6
6
  export type { AuthMiddlewareOptions, TenantAuthLike } from "./tenant/auth";
7
7
  export { createTenantMembershipAssert } from "./tenant/membership";
8
8
  export type { TenantMembershipOptions, TenantMembershipAssert } from "./tenant/membership";
@@ -14,7 +14,7 @@ export { createCompressPlugin, createAsyncSendGuard } from "./http/compress";
14
14
  export type { CompressOptions } from "./http/compress";
15
15
  export type { SharedSecretGuardOptions } from "./http/shared-secret";
16
16
  export type { PublicRouteOptions, PublicRouteRule, PublicRouteLike } from "./http/public-route";
17
- export { createMultitenantPrisma } from "./prisma/multitenant";
17
+ export { createMultitenantPrisma, resolveStatementTimeout } from "./prisma/multitenant";
18
18
  export { createMultitenantPrismaMariaDb } from "./prisma/mariadb-factory";
19
19
  export type { MariaDbMultitenantOptions } from "./prisma/mariadb-factory";
20
20
  export { withTenantSchema } from "./prisma/raw-tenant";
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EMBED_MODEL = exports.GEMINI_MODEL = exports.EMBED_DIM = exports.GeminiHelp = exports.createGcfHandler = exports.isInternalError = exports.createErrorHandler = exports.getBucket = exports.getDefaultAuth = exports.getTenantAuth = exports.initFirebaseAdmin = exports.getFirebaseStorage = exports.getFirebaseClientApp = exports.createFirebaseClientPlugin = exports.createSwaggerPlugin = exports.DEFAULT_CORS = exports.createCorsPlugin = exports.withTenantSchema = exports.createMultitenantPrismaMariaDb = exports.createMultitenantPrisma = exports.createAsyncSendGuard = exports.createCompressPlugin = exports.createSharedSecretGuard = exports.safeEqual = exports.isPublicRoute = exports.publicPath = exports.publicRoute = exports.RequestScopeError = exports.runInRequestScope = exports.getRequestScope = exports.requestScoped = exports.createRequestScopePlugin = exports.createTenantMembershipAssert = exports.createAuthMiddleware = exports.InvalidTenantError = exports.createTenantMiddleware = exports.readRawTenantId = exports.resolveTenantId = void 0;
3
+ exports.EMBED_MODEL = exports.GEMINI_MODEL = exports.EMBED_DIM = exports.GeminiHelp = exports.createGcfHandler = exports.isInternalError = exports.createErrorHandler = exports.getBucket = exports.getDefaultAuth = exports.getTenantAuth = exports.initFirebaseAdmin = exports.getFirebaseStorage = exports.getFirebaseClientApp = exports.createFirebaseClientPlugin = exports.createSwaggerPlugin = exports.DEFAULT_CORS = exports.createCorsPlugin = exports.withTenantSchema = exports.createMultitenantPrismaMariaDb = exports.resolveStatementTimeout = exports.createMultitenantPrisma = exports.createAsyncSendGuard = exports.createCompressPlugin = exports.createSharedSecretGuard = exports.safeEqual = exports.isPublicRoute = exports.publicPath = exports.publicRoute = exports.RequestScopeError = exports.runInRequestScope = exports.getRequestScope = exports.requestScoped = exports.createRequestScopePlugin = exports.createTenantMembershipAssert = exports.canonicalRequestPath = exports.createAuthMiddleware = exports.InvalidTenantError = exports.createTenantMiddleware = exports.readRawTenantId = exports.resolveTenantId = void 0;
4
4
  var resolve_1 = require("./tenant/resolve");
5
5
  Object.defineProperty(exports, "resolveTenantId", { enumerable: true, get: function () { return resolve_1.resolveTenantId; } });
6
6
  Object.defineProperty(exports, "readRawTenantId", { enumerable: true, get: function () { return resolve_1.readRawTenantId; } });
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "createTenantMiddleware", { enumerable: true, get
9
9
  Object.defineProperty(exports, "InvalidTenantError", { enumerable: true, get: function () { return middleware_1.InvalidTenantError; } });
10
10
  var auth_1 = require("./tenant/auth");
11
11
  Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_1.createAuthMiddleware; } });
12
+ Object.defineProperty(exports, "canonicalRequestPath", { enumerable: true, get: function () { return auth_1.canonicalRequestPath; } });
12
13
  var membership_1 = require("./tenant/membership");
13
14
  Object.defineProperty(exports, "createTenantMembershipAssert", { enumerable: true, get: function () { return membership_1.createTenantMembershipAssert; } });
14
15
  var request_scope_1 = require("./scope/request-scope");
@@ -29,6 +30,7 @@ Object.defineProperty(exports, "createCompressPlugin", { enumerable: true, get:
29
30
  Object.defineProperty(exports, "createAsyncSendGuard", { enumerable: true, get: function () { return compress_1.createAsyncSendGuard; } });
30
31
  var multitenant_1 = require("./prisma/multitenant");
31
32
  Object.defineProperty(exports, "createMultitenantPrisma", { enumerable: true, get: function () { return multitenant_1.createMultitenantPrisma; } });
33
+ Object.defineProperty(exports, "resolveStatementTimeout", { enumerable: true, get: function () { return multitenant_1.resolveStatementTimeout; } });
32
34
  var mariadb_factory_1 = require("./prisma/mariadb-factory");
33
35
  Object.defineProperty(exports, "createMultitenantPrismaMariaDb", { enumerable: true, get: function () { return mariadb_factory_1.createMultitenantPrismaMariaDb; } });
34
36
  var raw_tenant_1 = require("./prisma/raw-tenant");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,4CAAkE;AAA1D,0GAAA,eAAe,OAAA;AAAE,0GAAA,eAAe,OAAA;AAGxC,kDAA+E;AAAvE,oHAAA,sBAAsB,OAAA;AAAE,gHAAA,kBAAkB,OAAA;AAGlD,sCAAmD;AAA3C,4GAAA,oBAAoB,OAAA;AAG5B,kDAAiE;AAAzD,0HAAA,4BAA4B,OAAA;AAGpC,uDAAqI;AAA7H,yHAAA,wBAAwB,OAAA;AAAE,8GAAA,aAAa,OAAA;AAAE,gHAAA,eAAe,OAAA;AAAE,kHAAA,iBAAiB,OAAA;AAAE,kHAAA,iBAAiB,OAAA;AAGtG,oDAAsF;AAA9E,2GAAA,WAAW,OAAA;AAAE,0GAAA,UAAU,OAAA;AAAE,6GAAA,aAAa,OAAA;AAAE,yGAAA,SAAS,OAAA;AACzD,sDAA6D;AAArD,wHAAA,uBAAuB,OAAA;AAE/B,4CAA2E;AAAnE,gHAAA,oBAAoB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAKlD,oDAA6D;AAArD,sHAAA,uBAAuB,OAAA;AAC/B,4DAAwE;AAAhE,iIAAA,8BAA8B,OAAA;AAGtC,kDAAqD;AAA7C,8GAAA,gBAAgB,OAAA;AAUxB,wCAA6D;AAArD,0GAAA,gBAAgB,OAAA;AAAE,sGAAA,YAAY,OAAA;AAGtC,2CAAqD;AAA7C,6GAAA,mBAAmB,OAAA;AAG3B,0DAA8G;AAAtG,2HAAA,0BAA0B,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AAG5E,0CAA6F;AAArF,0GAAA,iBAAiB,OAAA;AAAE,sGAAA,aAAa,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,kGAAA,SAAS,OAAA;AAGnE,sDAAyE;AAAjE,mHAAA,kBAAkB,OAAA;AAAE,gHAAA,eAAe,OAAA;AAG3C,kDAAoD;AAA5C,+GAAA,gBAAgB,OAAA;AAGxB,sCAA6E;AAArE,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,sGAAA,YAAY,OAAA;AAAE,qGAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,4CAAkE;AAA1D,0GAAA,eAAe,OAAA;AAAE,0GAAA,eAAe,OAAA;AAGxC,kDAA+E;AAAvE,oHAAA,sBAAsB,OAAA;AAAE,gHAAA,kBAAkB,OAAA;AAGlD,sCAAyE;AAAjE,4GAAA,oBAAoB,OAAA;AAAE,4GAAA,oBAAoB,OAAA;AAGlD,kDAAiE;AAAzD,0HAAA,4BAA4B,OAAA;AAGpC,uDAAqI;AAA7H,yHAAA,wBAAwB,OAAA;AAAE,8GAAA,aAAa,OAAA;AAAE,gHAAA,eAAe,OAAA;AAAE,kHAAA,iBAAiB,OAAA;AAAE,kHAAA,iBAAiB,OAAA;AAGtG,oDAAsF;AAA9E,2GAAA,WAAW,OAAA;AAAE,0GAAA,UAAU,OAAA;AAAE,6GAAA,aAAa,OAAA;AAAE,yGAAA,SAAS,OAAA;AACzD,sDAA6D;AAArD,wHAAA,uBAAuB,OAAA;AAE/B,4CAA2E;AAAnE,gHAAA,oBAAoB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAKlD,oDAAsF;AAA9E,sHAAA,uBAAuB,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AACxD,4DAAwE;AAAhE,iIAAA,8BAA8B,OAAA;AAGtC,kDAAqD;AAA7C,8GAAA,gBAAgB,OAAA;AAUxB,wCAA6D;AAArD,0GAAA,gBAAgB,OAAA;AAAE,sGAAA,YAAY,OAAA;AAGtC,2CAAqD;AAA7C,6GAAA,mBAAmB,OAAA;AAG3B,0DAA8G;AAAtG,2HAAA,0BAA0B,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AAG5E,0CAA6F;AAArF,0GAAA,iBAAiB,OAAA;AAAE,sGAAA,aAAa,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,kGAAA,SAAS,OAAA;AAGnE,sDAAyE;AAAjE,mHAAA,kBAAkB,OAAA;AAAE,gHAAA,eAAe,OAAA;AAG3C,kDAAoD;AAA5C,+GAAA,gBAAgB,OAAA;AAGxB,sCAA6E;AAArE,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,sGAAA,YAAY,OAAA;AAAE,qGAAA,WAAW,OAAA"}
@@ -1,6 +1,8 @@
1
1
  export type TenantClient<T> = T & {
2
2
  $schema: string;
3
3
  };
4
+ /** Teto de execução: opção > env DB_STATEMENT_TIMEOUT_MS > 60000; inválido ou negativo cai no default; 0 desliga. */
5
+ export declare function resolveStatementTimeout(value?: number | string | null): number;
4
6
  export interface PoolConfigLike {
5
7
  host?: string;
6
8
  port?: number;
@@ -14,6 +16,7 @@ export interface PoolConfigLike {
14
16
  minimumIdle?: number;
15
17
  prepareCacheLength?: number;
16
18
  resetAfterUse?: boolean;
19
+ sessionVariables?: Record<string, string | number>;
17
20
  }
18
21
  export interface PoolLike {
19
22
  end(): Promise<void>;
@@ -46,6 +49,13 @@ export interface MultitenantOptions<TClient, TPool extends PoolLike> {
46
49
  minimumIdle?: number;
47
50
  /** Deriva o nome do database do tenant (default: troca "school_1" por "school_{id}") */
48
51
  tenantDbName?: (baseDbName: string, idSchool: string) => string;
52
+ /** Teto de execução de SELECT no MySQL (max_execution_time, ms) aplicado em
53
+ * toda conexão do pool. Default: env DB_STATEMENT_TIMEOUT_MS ou 60000.
54
+ * 0 desliga. O Prisma não cancela a consulta quando o cliente HTTP
55
+ * desiste: sem o teto, um SELECT pesado segue rodando no banco por
56
+ * minutos e degrada todas as APIs; com ele, o próprio MySQL mata a
57
+ * consulta. */
58
+ statementTimeoutMs?: number;
49
59
  log?: unknown;
50
60
  errorFormat?: string;
51
61
  }
@@ -8,7 +8,16 @@
8
8
  // A lib não depende de @prisma/client, @prisma/adapter-mariadb nem mariadb:
9
9
  // cada API injeta o SEU client gerado e as suas versões do adapter/driver.
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.resolveStatementTimeout = resolveStatementTimeout;
11
12
  exports.createMultitenantPrisma = createMultitenantPrisma;
13
+ /** Teto de execução: opção > env DB_STATEMENT_TIMEOUT_MS > 60000; inválido ou negativo cai no default; 0 desliga. */
14
+ function resolveStatementTimeout(value) {
15
+ const raw = value ?? process.env.DB_STATEMENT_TIMEOUT_MS ?? 60000;
16
+ const n = Number(raw);
17
+ if (!Number.isFinite(n) || n < 0)
18
+ return 60000;
19
+ return Math.floor(n);
20
+ }
12
21
  function defaultTenantDbName(baseDbName, idSchool) {
13
22
  return baseDbName.replace("school_1", `school_${idSchool}`);
14
23
  }
@@ -20,6 +29,7 @@ function createMultitenantPrisma(options) {
20
29
  Number(process.env.PRISMA_POOL_LIMIT ||
21
30
  parsed.searchParams.get("connection_limit") ||
22
31
  5);
32
+ const statementTimeoutMs = resolveStatementTimeout(options.statementTimeoutMs);
23
33
  const pool = options.createPool({
24
34
  ...(socketPath
25
35
  ? { socketPath }
@@ -48,6 +58,7 @@ function createMultitenantPrisma(options) {
48
58
  // MariaDB) — cai num ROLLBACK que preserva o database selecionado. Por isso
49
59
  // a proteção real do vazamento cross-tenant é o withTenantSchema, não isto.
50
60
  resetAfterUse: true,
61
+ ...(statementTimeoutMs > 0 ? { sessionVariables: { max_execution_time: statementTimeoutMs } } : {}),
51
62
  });
52
63
  const tenantDbName = options.tenantDbName ?? defaultTenantDbName;
53
64
  const clients = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"multitenant.js","sourceRoot":"","sources":["../../src/prisma/multitenant.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"multitenant.js","sourceRoot":"","sources":["../../src/prisma/multitenant.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,6 @@ export interface TenantSchemaClientLike {
4
4
  /** $transaction interativa do PrismaClient */
5
5
  $transaction: <R>(fn: (tx: any) => Promise<R>) => Promise<R>;
6
6
  }
7
+ /** @deprecated Quebrado com @prisma/adapter-mariadb (Error 1295 no `USE`) —
8
+ * ver o cabeçalho deste arquivo para as alternativas. */
7
9
  export declare function withTenantSchema<R>(prisma: TenantSchemaClientLike, fn: (tx: any) => Promise<R>): Promise<R>;
@@ -2,6 +2,24 @@
2
2
  // Executa SQL cru (relatórios/views com tabelas SEM qualificar) contra o
3
3
  // database do tenant, sem deixar a conexão suja no pool.
4
4
  //
5
+ // ⚠️ NÃO FUNCIONA com createMultitenantPrisma/createMultitenantPrismaMariaDb:
6
+ // o @prisma/adapter-mariadb roda TODO raw (inclusive *Unsafe) via
7
+ // `conn.execute` — protocolo de prepared statement — a menos que o adapter
8
+ // seja criado com `useTextProtocol: true` (o multitenant não liga). MySQL e
9
+ // MariaDB não aceitam `USE` nesse protocolo, então o `USE` abaixo falha com
10
+ // Error 1295: "This command is not supported in the prepared statement
11
+ // protocol yet".
12
+ // Alternativas que funcionam hoje:
13
+ // 1. SQL conhecida em tempo de escrita (a maioria dos casos): qualifique
14
+ // cada tabela com `${prisma.$schema}`.`tabela` na própria string, sem USE.
15
+ // 2. SQL genuinamente arbitrária: pegue uma conexão crua do pool
16
+ // (`multitenant.pool.getConnection()`), rode `USE` + a query pelo
17
+ // protocolo texto do driver (`conn.query`, fora do adapter) e, no
18
+ // finally, neutralize com `USE information_schema` + `release()`.
19
+ // Até a função ser reescrita com a técnica 2, NÃO CHAME withTenantSchema.
20
+ //
21
+ // --- racional original (o problema que a função tenta resolver continua real):
22
+ //
5
23
  // O pool é único e SEM database default (ver multitenant.ts): um raw não
6
24
  // qualificado precisa de `USE` para selecionar o schema. Mas o `USE` gruda o
7
25
  // database selecionado na conexão; quando ela volta ao pool, o próximo
@@ -21,6 +39,8 @@
21
39
  // (falha alto) em vez de atingir silenciosamente outra escola.
22
40
  Object.defineProperty(exports, "__esModule", { value: true });
23
41
  exports.withTenantSchema = withTenantSchema;
42
+ /** @deprecated Quebrado com @prisma/adapter-mariadb (Error 1295 no `USE`) —
43
+ * ver o cabeçalho deste arquivo para as alternativas. */
24
44
  async function withTenantSchema(prisma, fn) {
25
45
  const schema = prisma.$schema;
26
46
  // o nome entra cru num `USE` — só aceita identificador de database seguro
@@ -1 +1 @@
1
- {"version":3,"file":"raw-tenant.js","sourceRoot":"","sources":["../../src/prisma/raw-tenant.ts"],"names":[],"mappings":";AAAA,yEAAyE;AACzE,yDAAyD;AACzD,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAC7E,uEAAuE;AACvE,+EAA+E;AAC/E,mDAAmD;AACnD,EAAE;AACF,0EAA0E;AAC1E,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,kEAAkE;AAClE,gFAAgF;AAChF,4BAA4B;AAC5B,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,+DAA+D;;AAS/D,4CAkBC;AAlBM,KAAK,UAAU,gBAAgB,CAClC,MAA8B,EAC9B,EAA2B;IAE3B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,0EAA0E;IAC1E,IAAI,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,8CAA8C,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;QACzC,MAAM,EAAE,CAAC,iBAAiB,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;gBAAS,CAAC;YACP,0EAA0E;YAC1E,MAAM,EAAE,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"raw-tenant.js","sourceRoot":"","sources":["../../src/prisma/raw-tenant.ts"],"names":[],"mappings":";AAAA,yEAAyE;AACzE,yDAAyD;AACzD,EAAE;AACF,8EAA8E;AAC9E,kEAAkE;AAClE,2EAA2E;AAC3E,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,mBAAmB;AACnB,mCAAmC;AACnC,2EAA2E;AAC3E,gFAAgF;AAChF,mEAAmE;AACnE,uEAAuE;AACvE,uEAAuE;AACvE,uEAAuE;AACvE,0EAA0E;AAC1E,EAAE;AACF,gFAAgF;AAChF,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAC7E,uEAAuE;AACvE,+EAA+E;AAC/E,mDAAmD;AACnD,EAAE;AACF,0EAA0E;AAC1E,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,kEAAkE;AAClE,gFAAgF;AAChF,4BAA4B;AAC5B,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,+DAA+D;;AAW/D,4CAkBC;AApBD;0DAC0D;AACnD,KAAK,UAAU,gBAAgB,CAClC,MAA8B,EAC9B,EAA2B;IAE3B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,0EAA0E;IAC1E,IAAI,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,8CAA8C,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;QACzC,MAAM,EAAE,CAAC,iBAAiB,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;gBAAS,CAAC;YACP,0EAA0E;YAC1E,MAAM,EAAE,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -18,7 +18,9 @@
18
18
  //
19
19
  // Uso fora de uma request (timer, escopo de módulo, job) lança
20
20
  // RequestScopeError com o nome da classe: é a proteção desejada — antes,
21
- // misturava dados em silêncio.
21
+ // misturava dados em silêncio. Exceção: `then` e símbolos fora de request
22
+ // devolvem undefined — um `await` acidental sobre o Proxy ou uma inspeção
23
+ // (console.log, util.inspect) não são uso do service e não devem explodir.
22
24
  Object.defineProperty(exports, "__esModule", { value: true });
23
25
  exports.RequestScopeError = void 0;
24
26
  exports.getRequestScope = getRequestScope;
@@ -92,6 +94,8 @@ function requestScoped(Ctor, ...args) {
92
94
  const target = Object.create(Ctor.prototype);
93
95
  return new Proxy(target, {
94
96
  get(_t, prop) {
97
+ if (!storage.getStore() && (prop === "then" || typeof prop === "symbol"))
98
+ return undefined;
95
99
  const instance = resolve();
96
100
  const value = Reflect.get(instance, prop, instance);
97
101
  return typeof value === "function" ? value.bind(instance) : value;
@@ -101,6 +105,8 @@ function requestScoped(Ctor, ...args) {
101
105
  return Reflect.set(instance, prop, value, instance);
102
106
  },
103
107
  has(_t, prop) {
108
+ if (!storage.getStore() && typeof prop === "symbol")
109
+ return false;
104
110
  return Reflect.has(resolve(), prop);
105
111
  },
106
112
  deleteProperty(_t, prop) {
@@ -1 +1 @@
1
- {"version":3,"file":"request-scope.js","sourceRoot":"","sources":["../../src/scope/request-scope.ts"],"names":[],"mappings":";AAAA,6CAA6C;AAC7C,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,uEAAuE;AACvE,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAC9E,mCAAmC;AACnC,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,iDAAiD;AACjD,EAAE;AACF,+DAA+D;AAC/D,yEAAyE;AACzE,+BAA+B;;;AAwB/B,0CAEC;AAGD,8CAEC;AAQD,4DAeC;AASD,sCA8CC;AA3GD,uDAAmD;AASnD,MAAa,iBAAkB,SAAQ,KAAK;IACxC,YAAY,SAAiB;QACzB,KAAK,CAAC,mBAAmB,SAAS,oCAAoC;YAClE,6FAA6F,CAAC,CAAC;QACnG,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACpC,CAAC;CACJ;AAND,8CAMC;AAED,MAAM,OAAO,GAAG,IAAI,oCAAiB,EAAqB,CAAC;AAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxE,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEjB,mFAAmF;AACnF,SAAgB,eAAe;IAC3B,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AACtC,CAAC;AAED,kFAAkF;AAClF,SAAgB,iBAAiB,CAAI,EAAW;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAC,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,SAAgB,wBAAwB;IACpC,OAAO,KAAK,UAAU,kBAAkB,CAAC,OAAY;QACjD,IAAI,OAAO,CAAC,UAAU,CAAC;YAAE,OAAO;QAChC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QAE3B,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAS,EAAE,MAAW,EAAE,IAAgB,EAAE,EAAE;YACtE,OAAO,CAAC,GAAG,CAAC,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAC,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,IAAS,EAAE,MAAW,EAAE,IAAgB,EAAE,EAAE;YACvE,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,KAAK;gBAAE,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,aAAa,CAAmB,IAA+B,EAAE,GAAG,IAAW;IAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/B,MAAM,OAAO,GAAG,GAAM,EAAE;QACpB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;QAChE,IAAI,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAkB,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7B,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC;IAEF,mEAAmE;IACnE,wEAAwE;IACxE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAM,CAAC;IAElD,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;QACrB,GAAG,CAAC,EAAE,EAAE,IAAI;YACR,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAe,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC3D,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACtE,CAAC;QACD,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK;YACf,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAe,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;QACD,GAAG,CAAC,EAAE,EAAE,IAAI;YACR,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAS,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,cAAc,CAAC,EAAE,EAAE,IAAI;YACnB,OAAO,OAAO,CAAC,cAAc,CAAC,OAAO,EAAS,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO;YACH,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAS,CAAC,CAAC;QAC7C,CAAC;QACD,wBAAwB,CAAC,EAAE,EAAE,IAAI;YAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,wBAAwB,CAAC,OAAO,EAAS,EAAE,IAAI,CAAC,CAAC;YAC5E,IAAI,UAAU;gBAAE,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC;YAC/C,OAAO,UAAU,CAAC;QACtB,CAAC;QACD,cAAc;YACV,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"request-scope.js","sourceRoot":"","sources":["../../src/scope/request-scope.ts"],"names":[],"mappings":"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"}
@@ -39,4 +39,12 @@ export interface AuthMiddlewareOptions {
39
39
  /** Tamanho máximo do cache (default 2000) */
40
40
  cacheMaxSize?: number;
41
41
  }
42
+ /**
43
+ * Caminho da rota que o roteador ESCOLHEU, com os parâmetros que ELE extraiu.
44
+ * Com rota: padrão (`routeOptions.url`) + `params`, cada valor re-codificado —
45
+ * um `%2F` dentro de um parâmetro não vira `/` e não cria segmento novo para
46
+ * uma regex pública casar. Sem rota (404): a URL higienizada como o roteador
47
+ * faz (corta em `?` e `;`, decodifica `%xx`).
48
+ */
49
+ export declare function canonicalRequestPath(request: any): string;
42
50
  export declare function createAuthMiddleware(options: AuthMiddlewareOptions): (fastify: any) => Promise<void>;
@@ -14,8 +14,43 @@
14
14
  // VALIDAÇÃO criptográfica é do verifyIdToken do tenant correspondente —
15
15
  // um token forjado para outro tenant não verifica.
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.canonicalRequestPath = canonicalRequestPath;
17
18
  exports.createAuthMiddleware = createAuthMiddleware;
18
19
  const public_route_1 = require("../http/public-route");
20
+ /**
21
+ * Caminho da rota que o roteador ESCOLHEU, com os parâmetros que ELE extraiu.
22
+ * Com rota: padrão (`routeOptions.url`) + `params`, cada valor re-codificado —
23
+ * um `%2F` dentro de um parâmetro não vira `/` e não cria segmento novo para
24
+ * uma regex pública casar. Sem rota (404): a URL higienizada como o roteador
25
+ * faz (corta em `?` e `;`, decodifica `%xx`).
26
+ */
27
+ function canonicalRequestPath(request) {
28
+ const pattern = request?.routeOptions?.url;
29
+ const params = request?.params ?? {};
30
+ if (typeof pattern === "string" && pattern) {
31
+ return pattern
32
+ .replace(/::/g, "\u0000")
33
+ .replace(/:([A-Za-z0-9_]+)(\([^)]*\))?/g, (_m, name) => encodeParam(params[name]))
34
+ .replace(/\*$/, () => {
35
+ const rest = params["*"];
36
+ return rest === undefined || rest === null ? "" : String(rest).split("/").map(encodeParam).join("/");
37
+ })
38
+ .replace(/\u0000/g, ":");
39
+ }
40
+ const raw = String(request?.raw?.url ?? request?.url ?? "");
41
+ const path = raw.split("?")[0].split(";")[0];
42
+ try {
43
+ return decodeURI(path);
44
+ }
45
+ catch {
46
+ return path;
47
+ }
48
+ }
49
+ function encodeParam(value) {
50
+ if (value === undefined || value === null)
51
+ return "";
52
+ return encodeURIComponent(String(value));
53
+ }
19
54
  function createAuthMiddleware(options) {
20
55
  const TOKEN_CACHE = new Map();
21
56
  const MAX_CACHE_SIZE = options.cacheMaxSize ?? 2000;
@@ -47,12 +82,12 @@ function createAuthMiddleware(options) {
47
82
  return async function authMiddleware(fastify) {
48
83
  fastify.decorate("authenticate", async (request, reply) => {
49
84
  try {
50
- // Testa só o PATHNAME. request.raw.url inclui a query string;
51
- // testar a URL crua deixava um `?x=/public/a` casar rotas
52
- // públicas não ancoradas e burlar a autenticação por completo
53
- // (GET protegido → 401, mas `...?cb=/webhook` → 200 sem token).
54
- const rawUrl = request.raw?.url || "";
55
- const pathname = rawUrl.split("?")[0];
85
+ // Rota pública (e rota interna) é decidida sobre o MESMO caminho
86
+ // que o roteador usou, nunca sobre a URL crua: o roteador corta
87
+ // em `?` e `;` e decodifica `%xx`, então `...?cb=/webhook`,
88
+ // `/v1/1/users;/webhook` ou `/.../%61dmin/...` casavam a regex
89
+ // e executavam a rota protegida sem token.
90
+ const pathname = canonicalRequestPath(request);
56
91
  if ((0, public_route_1.isPublicRoute)(options.publicRoutes, pathname, request.method) || pathname === "" || pathname === "/") {
57
92
  return;
58
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tenant/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tenant/auth.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mybuildex/pkg",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Infra comum das APIs MyBuilder: multitenancy Prisma (pool único), middleware de tenant e CORS",
5
5
  "license": "MIT",
6
6
  "repository": {