@zintrust/core 2.5.5 → 2.5.7
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/package.json +1 -1
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/D1MigrateCommand.js +2 -4
- package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -1
- package/src/http/middleware/BodyParsingMiddleware.js +19 -0
- package/src/http/parsers/BodyParsers.d.ts.map +1 -1
- package/src/http/parsers/BodyParsers.js +32 -0
- package/src/index.js +3 -3
- package/src/orm/Database.d.ts.map +1 -1
- package/src/orm/Database.js +0 -3
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/D1Adapter.js +13 -1
- package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -1
- package/src/proxy/d1/ZintrustD1Proxy.js +37 -10
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1MigrateCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/D1MigrateCommand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"D1MigrateCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/D1MigrateCommand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA0IrE;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;cACO,YAAY;EAgCtB,CAAC"}
|
|
@@ -37,10 +37,8 @@ const buildExecutionContext = (options) => {
|
|
|
37
37
|
const dbName = getDbName(projectRoot, options);
|
|
38
38
|
const env = typeof options['env'] === 'string' ? options['env'].trim() : undefined;
|
|
39
39
|
const config = (typeof options['config'] === 'string' ? options['config'].trim() : undefined) ??
|
|
40
|
-
(typeof options
|
|
41
|
-
|
|
42
|
-
: undefined) ??
|
|
43
|
-
(typeof options['wc'] === 'string' ? options['wc'].trim() : undefined);
|
|
40
|
+
(typeof options.wranglerConfig === 'string' ? options.wranglerConfig.trim() : undefined) ??
|
|
41
|
+
(typeof options.wc === 'string' ? options.wc.trim() : undefined);
|
|
44
42
|
const migrationsRelDir = isWorkerCommand
|
|
45
43
|
? path.join('database', 'migrations', 'd1')
|
|
46
44
|
: WranglerConfig.getD1MigrationsDir(projectRoot, dbName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BodyParsingMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/http/middleware/BodyParsingMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"BodyParsingMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/http/middleware/BodyParsingMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAiT9D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,UA4CnC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -213,6 +213,25 @@ const parseUrlEncodedBody = (text) => {
|
|
|
213
213
|
}
|
|
214
214
|
out[key] = [existing, value];
|
|
215
215
|
}
|
|
216
|
+
// Recovery: if a JSON payload is sent with the wrong Content-Type header
|
|
217
|
+
// (e.g. application/x-www-form-urlencoded instead of application/json),
|
|
218
|
+
// URLSearchParams will treat the entire JSON string as a single key with
|
|
219
|
+
// an empty value. Detect this degenerate case and fall back to JSON.parse.
|
|
220
|
+
const keys = Object.keys(out);
|
|
221
|
+
if (keys.length === 1 && out[keys[0]] === '') {
|
|
222
|
+
const maybeJson = keys[0].trim();
|
|
223
|
+
if (maybeJson.startsWith('{') && maybeJson.endsWith('}')) {
|
|
224
|
+
try {
|
|
225
|
+
const parsed = JSON.parse(maybeJson);
|
|
226
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
227
|
+
return parsed;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Not valid JSON — leave original result unchanged
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
216
235
|
return out;
|
|
217
236
|
};
|
|
218
237
|
const processBodyParsing = async (req, res, contentType, maxBytes) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BodyParsers.d.ts","sourceRoot":"","sources":["../../../../src/http/parsers/BodyParsers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,gBAAgB;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;CAChD;
|
|
1
|
+
{"version":3,"file":"BodyParsers.d.ts","sourceRoot":"","sources":["../../../../src/http/parsers/BodyParsers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,gBAAgB;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;CAChD;AAiLD,eAAO,MAAM,WAAW;;;;IAKtB;;OAEG;cACO,WAAW,EAAE;IAIvB;;OAEG;4BACqB,MAAM,GAAG,WAAW,GAAG,SAAS;IAIxD;;OAEG;uBACgB,MAAM,QAAQ,MAAM,GAAG,MAAM,GAAG,gBAAgB;EAQnE,CAAC;AAEH,eAAe,WAAW,CAAC"}
|
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
* Body Parsers - Content-Type specific parsing
|
|
3
3
|
* Handles form-data, plain text, CSV, and other non-JSON formats
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Attempt to recover a JSON string that was parsed as a single form-urlencoded key.
|
|
7
|
+
* This handles cases where clients send JSON with the wrong Content-Type header.
|
|
8
|
+
*/
|
|
9
|
+
const tryRecoverJsonBody = (result) => {
|
|
10
|
+
const keys = Object.keys(result);
|
|
11
|
+
if (keys.length !== 1)
|
|
12
|
+
return undefined;
|
|
13
|
+
const singleValue = result[keys[0]];
|
|
14
|
+
if (singleValue !== '')
|
|
15
|
+
return undefined;
|
|
16
|
+
const maybeJson = keys[0].trim();
|
|
17
|
+
if (!maybeJson.startsWith('{') || !maybeJson.endsWith('}'))
|
|
18
|
+
return undefined;
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(maybeJson);
|
|
21
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Not valid JSON — leave original result unchanged
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
};
|
|
5
30
|
/**
|
|
6
31
|
* URL-encoded form data parser
|
|
7
32
|
* Content-Type: application/x-www-form-urlencoded
|
|
@@ -30,6 +55,13 @@ const FormDataParser = {
|
|
|
30
55
|
result[key] = value;
|
|
31
56
|
}
|
|
32
57
|
}
|
|
58
|
+
// Recovery: if a JSON payload is sent with the wrong Content-Type header,
|
|
59
|
+
// URLSearchParams will treat the entire JSON string as a single key with
|
|
60
|
+
// an empty value. Detect this degenerate case and fall back to JSON.parse.
|
|
61
|
+
const recovered = tryRecoverJsonBody(result);
|
|
62
|
+
if (recovered !== undefined) {
|
|
63
|
+
return { ok: true, data: recovered };
|
|
64
|
+
}
|
|
33
65
|
return { ok: true, data: result };
|
|
34
66
|
}
|
|
35
67
|
catch (error) {
|
package/src/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @zintrust/core v2.5.
|
|
2
|
+
* @zintrust/core v2.5.7
|
|
3
3
|
*
|
|
4
4
|
* ZinTrust Framework - Production-Grade TypeScript Backend
|
|
5
5
|
* Built for performance, type safety, and exceptional developer experience
|
|
6
6
|
*
|
|
7
7
|
* Build Information:
|
|
8
|
-
* Built: 2026-06-
|
|
8
|
+
* Built: 2026-06-12T18:33:47.619Z
|
|
9
9
|
* Node: >=20.0.0
|
|
10
10
|
* License: MIT
|
|
11
11
|
*
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* Available at runtime for debugging and health checks
|
|
22
22
|
*/
|
|
23
23
|
export const ZINTRUST_VERSION = '0.1.41';
|
|
24
|
-
export const ZINTRUST_BUILD_DATE = '2026-06-
|
|
24
|
+
export const ZINTRUST_BUILD_DATE = '2026-06-12T18:33:47.574Z'; // Replaced during build
|
|
25
25
|
export { Application } from './boot/Application.js';
|
|
26
26
|
export { AwsSigV4 } from './common/index.js';
|
|
27
27
|
export { SignedRequest } from './security/SignedRequest.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"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"}
|
package/src/orm/Database.js
CHANGED
|
@@ -456,9 +456,6 @@ export function useDatabase(config, connection = 'default') {
|
|
|
456
456
|
connection,
|
|
457
457
|
});
|
|
458
458
|
}
|
|
459
|
-
// Diagnostic logging
|
|
460
|
-
Logger.error('[DEBUG] Database instances keys:', Array.from(databaseInstances.keys()));
|
|
461
|
-
Logger.error('[DEBUG] Requesting connection:', connection);
|
|
462
459
|
throw ErrorFactory.createConfigError(`Database connection '${connection}' is not registered. ` +
|
|
463
460
|
`Call useDatabase(config, '${connection}') during startup to register it.`);
|
|
464
461
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1Adapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/D1Adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAEV,cAAc,EAGd,gBAAgB,EAEjB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"D1Adapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/D1Adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAEV,cAAc,EAGd,gBAAgB,EAEjB,MAAM,sBAAsB,CAAC;AAyG9B;;GAEG;AACH,eAAO,MAAM,SAAS;IACpB;;OAEG;oBAEa,cAAc,GAAG,gBAAgB;EAoKjD,CAAC;AAEH,eAAe,SAAS,CAAC"}
|
|
@@ -84,7 +84,19 @@ function getD1Binding(_config) {
|
|
|
84
84
|
function normalizeD1BindParameters(parameters) {
|
|
85
85
|
if (!Array.isArray(parameters))
|
|
86
86
|
return parameters;
|
|
87
|
-
return parameters.map((value) =>
|
|
87
|
+
return parameters.map((value) => {
|
|
88
|
+
if (typeof value === 'number' && Number.isInteger(value))
|
|
89
|
+
return String(value);
|
|
90
|
+
if (value instanceof Date)
|
|
91
|
+
return value.toISOString();
|
|
92
|
+
if (value !== null &&
|
|
93
|
+
typeof value === 'object' &&
|
|
94
|
+
!(value instanceof ArrayBuffer) &&
|
|
95
|
+
!ArrayBuffer.isView(value)) {
|
|
96
|
+
return JSON.stringify(value);
|
|
97
|
+
}
|
|
98
|
+
return value;
|
|
99
|
+
});
|
|
88
100
|
}
|
|
89
101
|
/**
|
|
90
102
|
* D1 adapter implementation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZintrustD1Proxy.d.ts","sourceRoot":"","sources":["../../../../src/proxy/d1/ZintrustD1Proxy.ts"],"names":[],"mappings":"AAUA,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAEjD,KAAK,qBAAqB,GAAG;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,GAAG,EAAE;QACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACtC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACrE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAChE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;KAChG,CAAC;IACF,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF,CAAC;AAEF,KAAK,WAAW,CAAC,CAAC,IAAI;IACpB,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;CACf,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,mBAAmB,CAAC;IACpD,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5C,GAAG,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;CACjC,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,mBAAmB,CAAC;CAC/C,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;
|
|
1
|
+
{"version":3,"file":"ZintrustD1Proxy.d.ts","sourceRoot":"","sources":["../../../../src/proxy/d1/ZintrustD1Proxy.ts"],"names":[],"mappings":"AAUA,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAEjD,KAAK,qBAAqB,GAAG;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,GAAG,EAAE;QACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACtC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACrE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAChE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;KAChG,CAAC;IACF,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF,CAAC;AAEF,KAAK,WAAW,CAAC,CAAC,IAAI;IACpB,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;CACf,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,mBAAmB,CAAC;IACpD,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5C,GAAG,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;CACjC,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,mBAAmB,CAAC;CAC/C,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAsWF,eAAO,MAAM,eAAe;;;mBAGL,OAAO,OAAO,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;EAqB5D,CAAC;AAEH,eAAe,eAAe,CAAC"}
|
|
@@ -151,17 +151,41 @@ const resolveSqlRequest = async (request, env) => {
|
|
|
151
151
|
return { ok: false, response: limit };
|
|
152
152
|
return { ok: true, db: resolved.db, sql: parsed.sql, params: parsed.params };
|
|
153
153
|
};
|
|
154
|
+
/**
|
|
155
|
+
* Normalize bind parameters before passing to D1's bind().
|
|
156
|
+
*
|
|
157
|
+
* D1 rejects JS objects and needs integer-valued numbers serialized for TEXT
|
|
158
|
+
* column compatibility, Dates as ISO strings, while blobs must be untouched.
|
|
159
|
+
*/
|
|
160
|
+
const normalizeParams = (params) => {
|
|
161
|
+
if (!Array.isArray(params))
|
|
162
|
+
return params;
|
|
163
|
+
return params.map((value) => {
|
|
164
|
+
if (typeof value === 'number' && Number.isInteger(value))
|
|
165
|
+
return String(value);
|
|
166
|
+
if (value instanceof Date)
|
|
167
|
+
return value.toISOString();
|
|
168
|
+
if (value !== null &&
|
|
169
|
+
typeof value === 'object' &&
|
|
170
|
+
!(value instanceof ArrayBuffer) &&
|
|
171
|
+
!ArrayBuffer.isView(value)) {
|
|
172
|
+
return JSON.stringify(value);
|
|
173
|
+
}
|
|
174
|
+
return value;
|
|
175
|
+
});
|
|
176
|
+
};
|
|
154
177
|
const handleQuery = async (request, env) => {
|
|
155
178
|
try {
|
|
156
179
|
const resolved = await resolveSqlRequest(request, env);
|
|
157
180
|
if (!resolved.ok)
|
|
158
181
|
return resolved.response;
|
|
182
|
+
const normalizedParams = normalizeParams(resolved.params);
|
|
159
183
|
const startedAt = Date.now();
|
|
160
184
|
const result = await resolved.db
|
|
161
185
|
.prepare(resolved.sql)
|
|
162
|
-
.bind(...
|
|
186
|
+
.bind(...normalizedParams)
|
|
163
187
|
.all();
|
|
164
|
-
SystemTraceWorkerBridge.emitQuery(resolved.sql,
|
|
188
|
+
SystemTraceWorkerBridge.emitQuery(resolved.sql, normalizedParams, Date.now() - startedAt, 'd1-proxy', routingFromMeta(result.meta));
|
|
165
189
|
const rows = result.results ?? [];
|
|
166
190
|
return json(200, { rows, rowCount: rows.length });
|
|
167
191
|
}
|
|
@@ -175,12 +199,13 @@ const handleQueryOne = async (request, env) => {
|
|
|
175
199
|
const resolved = await resolveSqlRequest(request, env);
|
|
176
200
|
if (!resolved.ok)
|
|
177
201
|
return resolved.response;
|
|
202
|
+
const normalizedParams = normalizeParams(resolved.params);
|
|
178
203
|
const startedAt = Date.now();
|
|
179
204
|
const row = await resolved.db
|
|
180
205
|
.prepare(resolved.sql)
|
|
181
|
-
.bind(...
|
|
206
|
+
.bind(...normalizedParams)
|
|
182
207
|
.first();
|
|
183
|
-
SystemTraceWorkerBridge.emitQuery(resolved.sql,
|
|
208
|
+
SystemTraceWorkerBridge.emitQuery(resolved.sql, normalizedParams, Date.now() - startedAt, 'd1-proxy');
|
|
184
209
|
return json(200, { row: row ?? null });
|
|
185
210
|
}
|
|
186
211
|
catch (error) {
|
|
@@ -193,12 +218,13 @@ const handleExec = async (request, env) => {
|
|
|
193
218
|
const resolved = await resolveSqlRequest(request, env);
|
|
194
219
|
if (!resolved.ok)
|
|
195
220
|
return resolved.response;
|
|
221
|
+
const normalizedParams = normalizeParams(resolved.params);
|
|
196
222
|
const startedAt = Date.now();
|
|
197
223
|
const out = await resolved.db
|
|
198
224
|
.prepare(resolved.sql)
|
|
199
|
-
.bind(...
|
|
225
|
+
.bind(...normalizedParams)
|
|
200
226
|
.run();
|
|
201
|
-
SystemTraceWorkerBridge.emitQuery(resolved.sql,
|
|
227
|
+
SystemTraceWorkerBridge.emitQuery(resolved.sql, normalizedParams, Date.now() - startedAt, 'd1-proxy', routingFromMeta(out.meta));
|
|
202
228
|
return json(200, { ok: true, meta: out.meta });
|
|
203
229
|
}
|
|
204
230
|
catch (error) {
|
|
@@ -236,20 +262,21 @@ const handleStatement = async (request, env) => {
|
|
|
236
262
|
if (!isString(sql) || sql.trim() === '') {
|
|
237
263
|
return toErrorResponse(404, 'NOT_FOUND', 'Unknown statementId');
|
|
238
264
|
}
|
|
265
|
+
const normalizedParams = normalizeParams(parsed.params);
|
|
239
266
|
const startedAt = Date.now();
|
|
240
267
|
if (isMutatingSql(sql)) {
|
|
241
268
|
const out = await resolved.db
|
|
242
269
|
.prepare(sql)
|
|
243
|
-
.bind(...
|
|
270
|
+
.bind(...normalizedParams)
|
|
244
271
|
.run();
|
|
245
|
-
SystemTraceWorkerBridge.emitQuery(sql,
|
|
272
|
+
SystemTraceWorkerBridge.emitQuery(sql, normalizedParams, Date.now() - startedAt, 'd1-proxy', routingFromMeta(out.meta));
|
|
246
273
|
return json(200, { ok: true, meta: out.meta });
|
|
247
274
|
}
|
|
248
275
|
const out = await resolved.db
|
|
249
276
|
.prepare(sql)
|
|
250
|
-
.bind(...
|
|
277
|
+
.bind(...normalizedParams)
|
|
251
278
|
.all();
|
|
252
|
-
SystemTraceWorkerBridge.emitQuery(sql,
|
|
279
|
+
SystemTraceWorkerBridge.emitQuery(sql, normalizedParams, Date.now() - startedAt, 'd1-proxy', routingFromMeta(out.meta));
|
|
253
280
|
const rows = out.results ?? [];
|
|
254
281
|
return json(200, { rows, rowCount: rows.length });
|
|
255
282
|
}
|