@valv/mysql
Advanced tools
@@ -8,2 +8,8 @@ import type { ValvAdapter, SchemaMap, Query, CompiledQuery, FnDef } from "@valv/core"; | ||
| database?: string; | ||
| /** | ||
| * Per-query wall-clock cap in milliseconds (`max_execution_time`, which MySQL | ||
| * enforces for read-only SELECTs). Defaults to 10000. Raise it for heavier | ||
| * analytical workloads; keep it low to bound a runaway query. | ||
| */ | ||
| statementTimeoutMs?: number; | ||
| } | ||
@@ -14,2 +20,3 @@ export declare class MySqlAdapter implements ValvAdapter { | ||
| private schemaCache; | ||
| private get timeoutMs(); | ||
| constructor(client: MySqlClient, options?: MySqlAdapterOptions); | ||
@@ -16,0 +23,0 @@ introspect(): Promise<SchemaMap>; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAErF,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAEnE,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAUD,qBAAa,YAAa,YAAW,WAAW;IAI5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IAJjB,OAAO,CAAC,WAAW,CAAyB;gBAGlC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,mBAAwB;IAGrC,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAMtC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,aAAa;IAIxD,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAI5B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAc3E"} | ||
| {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAErF,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAEnE,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AASD,qBAAa,YAAa,YAAW,WAAW;IAQ5C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IARjB,OAAO,CAAC,WAAW,CAAyB;IAE5C,OAAO,KAAK,SAAS,GAEpB;gBAGS,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,mBAAwB;IAGrC,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAMtC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,aAAa;IAIxD,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAI5B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAe3E"} |
+11
-8
@@ -6,10 +6,12 @@ "use strict"; | ||
| const introspection_1 = require("./introspection"); | ||
| // Per-query wall-clock cap so a structurally-valid query (e.g. a join that scans | ||
| // far more than expected) can't run away on the server. Applied via | ||
| // `max_execution_time` (milliseconds), which MySQL enforces for read-only | ||
| // SELECTs — exactly this adapter's queries. | ||
| const STATEMENT_TIMEOUT_MS = 10000; | ||
| // Default per-query wall-clock cap so a structurally-valid query (e.g. a join | ||
| // that scans far more than expected) can't run away on the server. Override per | ||
| // instance with `statementTimeoutMs`. | ||
| const DEFAULT_STATEMENT_TIMEOUT_MS = 10000; | ||
| // Read-only adapter: no `mutate`, so core refuses writes. Adding writes is | ||
| // emit{Insert,Update,Delete} over the same driver, when a real need appears. | ||
| class MySqlAdapter { | ||
| get timeoutMs() { | ||
| return this.options.statementTimeoutMs ?? DEFAULT_STATEMENT_TIMEOUT_MS; | ||
| } | ||
| constructor(client, options = {}) { | ||
@@ -31,4 +33,5 @@ this.client = client; | ||
| async execute(sql, parameters = []) { | ||
| // Pin the session before the query runs. Both settings are our own hardcoded | ||
| // literals (never user input), so inlining them is safe: | ||
| // Pin the session before the query runs. The timeout is a numeric config | ||
| // value and the zone is a literal — neither is model input, and a number | ||
| // can't carry SQL, so inlining them is safe: | ||
| // - max_execution_time caps read-only SELECT wall-clock. | ||
@@ -40,3 +43,3 @@ // - time_zone '+00:00' forces DATE_FORMAT bucketing (and any tz-sensitive | ||
| // consumer passes one per request, not a shared pool (see MySqlClient). | ||
| await this.client.query(`SET SESSION max_execution_time = ${STATEMENT_TIMEOUT_MS}`); | ||
| await this.client.query(`SET SESSION max_execution_time = ${this.timeoutMs}`); | ||
| await this.client.query(`SET time_zone = '+00:00'`); | ||
@@ -43,0 +46,0 @@ const [result] = await this.client.query(sql, parameters); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":";;;AACA,qCAA+D;AAC/D,mDAAmE;AASnE,iFAAiF;AACjF,oEAAoE;AACpE,0EAA0E;AAC1E,4CAA4C;AAC5C,MAAM,oBAAoB,GAAG,KAAM,CAAA;AAEnC,2EAA2E;AAC3E,6EAA6E;AAC7E,MAAa,YAAY;IAGvB,YACU,MAAmB,EACnB,UAA+B,EAAE;QADjC,WAAM,GAAN,MAAM,CAAa;QACnB,YAAO,GAAP,OAAO,CAA0B;QAJnC,gBAAW,GAAqB,IAAI,CAAA;IAKzC,CAAC;IAEJ,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,WAAW,KAAhB,IAAI,CAAC,WAAW,GACd,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,IAAA,+BAAe,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAA;QACpF,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,KAAY,EAAE,OAAkB;QACtC,OAAO,IAAA,WAAI,EAAC,KAAK,EAAE,OAAO,EAAE,mBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAChF,CAAC;IAED,SAAS;QACP,OAAO,EAAE,GAAG,qBAAc,EAAE,GAAG,mBAAY,CAAC,SAAS,EAAE,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,aAAwB,EAAE;QACnD,6EAA6E;QAC7E,yDAAyD;QACzD,0DAA0D;QAC1D,2EAA2E;QAC3E,8EAA8E;QAC9E,0EAA0E;QAC1E,0EAA0E;QAC1E,wEAAwE;QACxE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,oBAAoB,EAAE,CAAC,CAAA;QACnF,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACzD,OAAO,CAAC,MAAM,IAAI,EAAE,CAAc,CAAA;IACpC,CAAC;CACF;AApCD,oCAoCC"} | ||
| {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":";;;AACA,qCAA+D;AAC/D,mDAAmE;AAenE,8EAA8E;AAC9E,gFAAgF;AAChF,sCAAsC;AACtC,MAAM,4BAA4B,GAAG,KAAM,CAAA;AAE3C,2EAA2E;AAC3E,6EAA6E;AAC7E,MAAa,YAAY;IAGvB,IAAY,SAAS;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,4BAA4B,CAAA;IACxE,CAAC;IAED,YACU,MAAmB,EACnB,UAA+B,EAAE;QADjC,WAAM,GAAN,MAAM,CAAa;QACnB,YAAO,GAAP,OAAO,CAA0B;QARnC,gBAAW,GAAqB,IAAI,CAAA;IASzC,CAAC;IAEJ,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,WAAW,KAAhB,IAAI,CAAC,WAAW,GACd,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,IAAA,+BAAe,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAA;QACpF,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,KAAY,EAAE,OAAkB;QACtC,OAAO,IAAA,WAAI,EAAC,KAAK,EAAE,OAAO,EAAE,mBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAChF,CAAC;IAED,SAAS;QACP,OAAO,EAAE,GAAG,qBAAc,EAAE,GAAG,mBAAY,CAAC,SAAS,EAAE,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,aAAwB,EAAE;QACnD,yEAAyE;QACzE,yEAAyE;QACzE,6CAA6C;QAC7C,0DAA0D;QAC1D,2EAA2E;QAC3E,8EAA8E;QAC9E,0EAA0E;QAC1E,0EAA0E;QAC1E,wEAAwE;QACxE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC7E,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACzD,OAAO,CAAC,MAAM,IAAI,EAAE,CAAc,CAAA;IACpC,CAAC;CACF;AAzCD,oCAyCC"} |
+2
-0
@@ -9,2 +9,4 @@ import { Valv } from "@valv/core"; | ||
| database?: string; | ||
| /** Per-query wall-clock cap in milliseconds (`max_execution_time`). Defaults to 10000. */ | ||
| statementTimeoutMs?: number; | ||
| }; | ||
@@ -11,0 +13,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD,KAAK,YAAY,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG;IAC5E,yEAAyE;IACzE,MAAM,EAAE,YAAY,GAAG,SAAS,CAAA;IAChC,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,QAAQ,GAAG,cAAc,EACxD,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAWjC"} | ||
| {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD,KAAK,YAAY,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG;IAC5E,yEAAyE;IACzE,MAAM,EAAE,YAAY,GAAG,SAAS,CAAA;IAChC,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0FAA0F;IAC1F,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,QAAQ,GAAG,cAAc,EACxD,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAYjC"} |
+2
-1
@@ -13,3 +13,3 @@ "use strict"; | ||
| async function createValv(client, config) { | ||
| const { schema, database, ...rest } = config; | ||
| const { schema, database, statementTimeoutMs, ...rest } = config; | ||
| const valv = new core_1.Valv({ | ||
@@ -20,2 +20,3 @@ ...rest, | ||
| database, | ||
| statementTimeoutMs, | ||
| }), | ||
@@ -22,0 +23,0 @@ }); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":";;AAkBA,gCAcC;AAhCD,qCAAiC;AAEjC,uCAAwC;AAUxC;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAC9B,MAAmB,EACnB,MAA8B;IAE9B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;IAC5C,MAAM,IAAI,GAAG,IAAI,WAAI,CAAmB;QACtC,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,sBAAY,CAAC,MAAM,EAAE;YAChC,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACpD,QAAQ;SACT,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IACvB,OAAO,IAAI,CAAA;AACb,CAAC"} | ||
| {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":";;AAoBA,gCAeC;AAnCD,qCAAiC;AAEjC,uCAAwC;AAYxC;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAC9B,MAAmB,EACnB,MAA8B;IAE9B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;IAChE,MAAM,IAAI,GAAG,IAAI,WAAI,CAAmB;QACtC,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,sBAAY,CAAC,MAAM,EAAE;YAChC,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACpD,QAAQ;YACR,kBAAkB;SACnB,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IACvB,OAAO,IAAI,CAAA;AACb,CAAC"} |
+2
-2
| { | ||
| "name": "@valv/mysql", | ||
| "version": "0.2.1", | ||
| "version": "0.3.0", | ||
| "description": "MySQL adapter for valv — row-level security and access control for AI agents, over a runtime connection", | ||
@@ -40,3 +40,3 @@ "keywords": [ | ||
| "peerDependencies": { | ||
| "@valv/core": "^0.8.1", | ||
| "@valv/core": "^0.9.0", | ||
| "mysql2": "^3.0.0" | ||
@@ -43,0 +43,0 @@ }, |
24674
3.45%303
4.48%