@clickhouse/client 1.22.0-head.bb7d9d2.1 → 1.23.0-head.c8dc8d8.1
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 +2 -1
- package/dist/client.d.ts +2 -2
- package/dist/client.js +3 -3
- package/dist/client.js.map +1 -1
- package/dist/common/clickhouse_types.d.ts +98 -0
- package/dist/common/clickhouse_types.js +30 -0
- package/dist/common/clickhouse_types.js.map +1 -0
- package/dist/common/client.d.ts +233 -0
- package/dist/common/client.js +414 -0
- package/dist/common/client.js.map +1 -0
- package/dist/common/config.d.ts +234 -0
- package/dist/common/config.js +364 -0
- package/dist/common/config.js.map +1 -0
- package/dist/common/connection.d.ts +124 -0
- package/dist/common/connection.js +3 -0
- package/dist/common/connection.js.map +1 -0
- package/dist/common/data_formatter/format_query_params.d.ts +11 -0
- package/dist/common/data_formatter/format_query_params.js +128 -0
- package/dist/common/data_formatter/format_query_params.js.map +1 -0
- package/dist/common/data_formatter/format_query_settings.d.ts +2 -0
- package/dist/common/data_formatter/format_query_settings.js +20 -0
- package/dist/common/data_formatter/format_query_settings.js.map +1 -0
- package/dist/common/data_formatter/formatter.d.ts +41 -0
- package/dist/common/data_formatter/formatter.js +78 -0
- package/dist/common/data_formatter/formatter.js.map +1 -0
- package/dist/common/data_formatter/index.d.ts +3 -0
- package/dist/common/data_formatter/index.js +24 -0
- package/dist/common/data_formatter/index.js.map +1 -0
- package/dist/common/error/error.d.ts +20 -0
- package/dist/common/error/error.js +73 -0
- package/dist/common/error/error.js.map +1 -0
- package/dist/common/error/index.d.ts +1 -0
- package/dist/common/error/index.js +18 -0
- package/dist/common/error/index.js.map +1 -0
- package/dist/common/index.d.ts +67 -0
- package/dist/common/index.js +97 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/logger.d.ts +80 -0
- package/dist/common/logger.js +154 -0
- package/dist/common/logger.js.map +1 -0
- package/dist/common/parse/column_types.d.ts +127 -0
- package/dist/common/parse/column_types.js +586 -0
- package/dist/common/parse/column_types.js.map +1 -0
- package/dist/common/parse/index.d.ts +2 -0
- package/dist/common/parse/index.js +19 -0
- package/dist/common/parse/index.js.map +1 -0
- package/dist/common/parse/json_handling.d.ts +19 -0
- package/dist/common/parse/json_handling.js +8 -0
- package/dist/common/parse/json_handling.js.map +1 -0
- package/dist/common/result.d.ts +90 -0
- package/dist/common/result.js +3 -0
- package/dist/common/result.js.map +1 -0
- package/dist/common/settings.d.ts +1990 -0
- package/dist/common/settings.js +19 -0
- package/dist/common/settings.js.map +1 -0
- package/dist/common/tracing.d.ts +146 -0
- package/dist/common/tracing.js +76 -0
- package/dist/common/tracing.js.map +1 -0
- package/dist/common/ts_utils.d.ts +4 -0
- package/dist/common/ts_utils.js +3 -0
- package/dist/common/ts_utils.js.map +1 -0
- package/dist/common/utils/connection.d.ts +21 -0
- package/dist/common/utils/connection.js +43 -0
- package/dist/common/utils/connection.js.map +1 -0
- package/dist/common/utils/index.d.ts +5 -0
- package/dist/common/utils/index.js +22 -0
- package/dist/common/utils/index.js.map +1 -0
- package/dist/common/utils/multipart.d.ts +34 -0
- package/dist/common/utils/multipart.js +81 -0
- package/dist/common/utils/multipart.js.map +1 -0
- package/dist/common/utils/sleep.d.ts +4 -0
- package/dist/common/utils/sleep.js +12 -0
- package/dist/common/utils/sleep.js.map +1 -0
- package/dist/common/utils/stream.d.ts +15 -0
- package/dist/common/utils/stream.js +50 -0
- package/dist/common/utils/stream.js.map +1 -0
- package/dist/common/utils/url.d.ts +20 -0
- package/dist/common/utils/url.js +67 -0
- package/dist/common/utils/url.js.map +1 -0
- package/dist/common/version.d.ts +2 -0
- package/dist/common/version.js +4 -0
- package/dist/common/version.js.map +1 -0
- package/dist/config.d.ts +2 -2
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/connection/compression.d.ts +2 -2
- package/dist/connection/compression.js +4 -4
- package/dist/connection/compression.js.map +1 -1
- package/dist/connection/create_connection.d.ts +1 -1
- package/dist/connection/node_base_connection.d.ts +3 -3
- package/dist/connection/node_base_connection.js +22 -22
- package/dist/connection/node_base_connection.js.map +1 -1
- package/dist/connection/node_custom_agent_connection.js +2 -2
- package/dist/connection/node_custom_agent_connection.js.map +1 -1
- package/dist/connection/node_http_connection.js +2 -2
- package/dist/connection/node_http_connection.js.map +1 -1
- package/dist/connection/node_https_connection.d.ts +1 -1
- package/dist/connection/node_https_connection.js +3 -3
- package/dist/connection/node_https_connection.js.map +1 -1
- package/dist/connection/socket_pool.d.ts +1 -1
- package/dist/connection/socket_pool.js +30 -30
- package/dist/connection/socket_pool.js.map +1 -1
- package/dist/connection/stream.d.ts +1 -1
- package/dist/connection/stream.js +9 -9
- package/dist/connection/stream.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.js +24 -24
- package/dist/index.js.map +1 -1
- package/dist/result_set.d.ts +1 -1
- package/dist/result_set.js +10 -10
- package/dist/result_set.js.map +1 -1
- package/dist/utils/encoder.d.ts +1 -1
- package/dist/utils/encoder.js +5 -5
- package/dist/utils/encoder.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -5
- package/skills/clickhouse-js-node-rowbinary-parser/EXAMPLES.md +48 -0
- package/skills/clickhouse-js-node-rowbinary-parser/README.md +248 -0
- package/skills/clickhouse-js-node-rowbinary-parser/SKILL.md +190 -0
- package/skills/clickhouse-js-node-rowbinary-parser/case-studies/iot-rowbinary-vs-json.md +83 -0
- package/skills/clickhouse-js-node-rowbinary-parser/case-studies/ledger-rowbinary-vs-json.md +103 -0
- package/skills/clickhouse-js-node-rowbinary-parser/case-studies/logs-json-wins.md +86 -0
- package/skills/clickhouse-js-node-rowbinary-parser/case-studies/wasm-vs-js.md +172 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/aggregateFunction.ts +34 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/bool.ts +10 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/columnar.ts +125 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/composite.ts +181 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/core.ts +77 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/datetime.ts +113 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/decimals.ts +57 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/dynamic.ts +328 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/enums.ts +28 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/carts.ts +71 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/events.ts +51 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/iot.ts +158 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/ledger.ts +98 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/logs.ts +73 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/observability.ts +142 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/orders.ts +65 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/profiles.ts +60 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/examples/telemetry.ts +102 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/floats.ts +32 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/geo.ts +109 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/integers.ts +95 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/interval.ts +54 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/ip.ts +93 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/json.ts +33 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/lowCardinality.ts +18 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/nested.ts +23 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/nothing.ts +29 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/reader.ts +51 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/rows.ts +58 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/simpleAggregateFunction.ts +20 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/stream.ts +276 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/strings.ts +55 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/time.ts +61 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/uuid.ts +153 -0
- package/skills/clickhouse-js-node-rowbinary-parser/src/varint.ts +70 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prepareConfigWithURL = prepareConfigWithURL;
|
|
4
|
+
exports.getConnectionParams = getConnectionParams;
|
|
5
|
+
exports.mergeConfigs = mergeConfigs;
|
|
6
|
+
exports.createUrl = createUrl;
|
|
7
|
+
exports.loadConfigOptionsFromURL = loadConfigOptionsFromURL;
|
|
8
|
+
exports.booleanConfigURLValue = booleanConfigURLValue;
|
|
9
|
+
exports.numberConfigURLValue = numberConfigURLValue;
|
|
10
|
+
exports.enumConfigURLValue = enumConfigURLValue;
|
|
11
|
+
const logger_1 = require("./logger");
|
|
12
|
+
const json_handling_1 = require("./parse/json_handling");
|
|
13
|
+
/** Normalizes the public request compression option into the internal codec
|
|
14
|
+
* object, or `undefined` when disabled. `true` keeps gzip for backwards
|
|
15
|
+
* compatibility; the object form (carrying its per-codec option) is passed
|
|
16
|
+
* through verbatim, so untyped JS supplying an unknown codec still reaches the
|
|
17
|
+
* Node guard, which rejects it with a clear error. */
|
|
18
|
+
function normalizeRequestCompression(value) {
|
|
19
|
+
if (!value) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
if (value === true) {
|
|
23
|
+
return { codec: "gzip" };
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
/** Normalizes the public response compression option
|
|
28
|
+
* (`false | true | { codec }`) into the internal codec object, or `undefined`
|
|
29
|
+
* when disabled. `true` keeps gzip for backwards compatibility. */
|
|
30
|
+
function normalizeResponseCompression(value) {
|
|
31
|
+
if (!value) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
if (value === true) {
|
|
35
|
+
return { codec: "gzip" };
|
|
36
|
+
}
|
|
37
|
+
return { codec: value.codec };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Validates and normalizes the provided "base" config.
|
|
41
|
+
* Warns about deprecated configuration parameters usage.
|
|
42
|
+
* Parses the common URL parameters into the configuration parameters (these are the same for all implementations).
|
|
43
|
+
* Parses implementation-specific URL parameters using the handler provided by that implementation.
|
|
44
|
+
* Merges these parameters with the base config and implementation-specific defaults.
|
|
45
|
+
* Enforces certain defaults in case of deprecated keys or readonly mode.
|
|
46
|
+
*/
|
|
47
|
+
function prepareConfigWithURL(baseConfigOptions, logger, handleImplURLParams) {
|
|
48
|
+
const baseConfig = { ...baseConfigOptions };
|
|
49
|
+
if (baseConfig.additional_headers !== undefined) {
|
|
50
|
+
logger.warn({
|
|
51
|
+
module: "Config",
|
|
52
|
+
message: '"additional_headers" is deprecated. Use "http_headers" instead.',
|
|
53
|
+
});
|
|
54
|
+
baseConfig.http_headers = baseConfig.additional_headers;
|
|
55
|
+
delete baseConfig.additional_headers;
|
|
56
|
+
}
|
|
57
|
+
let configURL;
|
|
58
|
+
if (baseConfig.host !== undefined) {
|
|
59
|
+
logger.warn({
|
|
60
|
+
module: "Config",
|
|
61
|
+
message: '"host" is deprecated. Use "url" instead.',
|
|
62
|
+
});
|
|
63
|
+
configURL = createUrl(baseConfig.host);
|
|
64
|
+
delete baseConfig.host;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
configURL = createUrl(baseConfig.url);
|
|
68
|
+
}
|
|
69
|
+
const [url, configFromURL] = loadConfigOptionsFromURL(configURL, handleImplURLParams);
|
|
70
|
+
const config = mergeConfigs(baseConfig, configFromURL, logger);
|
|
71
|
+
if (config.pathname !== undefined) {
|
|
72
|
+
url.pathname = config.pathname;
|
|
73
|
+
}
|
|
74
|
+
config.url = url;
|
|
75
|
+
return config;
|
|
76
|
+
}
|
|
77
|
+
function getConnectionParams(config, logger) {
|
|
78
|
+
let auth;
|
|
79
|
+
if (config.access_token !== undefined) {
|
|
80
|
+
if (config.username !== undefined || config.password !== undefined) {
|
|
81
|
+
throw new Error("Both access token and username/password are provided in the configuration. Please use only one authentication method.");
|
|
82
|
+
}
|
|
83
|
+
auth = { access_token: config.access_token, type: "JWT" };
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
auth = {
|
|
87
|
+
username: config.username ?? "default",
|
|
88
|
+
password: config.password ?? "",
|
|
89
|
+
type: "Credentials",
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const log_level = config.log?.level ?? logger_1.ClickHouseLogLevel.WARN;
|
|
93
|
+
const request_timeout = config.request_timeout ?? 30_000;
|
|
94
|
+
const clickhouse_settings = config.clickhouse_settings ?? {};
|
|
95
|
+
if (log_level <= logger_1.ClickHouseLogLevel.WARN) {
|
|
96
|
+
// Warn if request_timeout is high but progress headers are not configured
|
|
97
|
+
// This can lead to socket hang-up errors when long-running queries exceed load balancer idle timeouts
|
|
98
|
+
const THRESHOLD_MS = 60_000; // 60 seconds
|
|
99
|
+
if (request_timeout > THRESHOLD_MS) {
|
|
100
|
+
const send_progress = String(clickhouse_settings.send_progress_in_http_headers) === "1";
|
|
101
|
+
const progress_interval = clickhouse_settings.http_headers_progress_interval_ms;
|
|
102
|
+
if (!send_progress) {
|
|
103
|
+
logger.warn({
|
|
104
|
+
module: "Config",
|
|
105
|
+
message: `request_timeout is set to ${request_timeout}ms, but send_progress_in_http_headers is not enabled. Long-running queries may fail with socket hang-up errors if they exceed the load balancer idle timeout. Consider enabling progress headers with clickhouse_settings: { send_progress_in_http_headers: 1, http_headers_progress_interval_ms: '<interval>' }. See https://github.com/ClickHouse/clickhouse-js/blob/main/docs/howto/long_running_queries.md for more details.`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else if (progress_interval === undefined) {
|
|
109
|
+
logger.warn({
|
|
110
|
+
module: "Config",
|
|
111
|
+
message: `request_timeout is set to ${request_timeout}ms and send_progress_in_http_headers is enabled, but http_headers_progress_interval_ms is not set. It is recommended to set http_headers_progress_interval_ms to a value slightly below your load balancer's idle timeout (e.g., '110000' for a 120s LB timeout). See https://github.com/ClickHouse/clickhouse-js/blob/main/docs/howto/long_running_queries.md for more details.`,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
auth,
|
|
118
|
+
url: config.url,
|
|
119
|
+
application_id: config.application,
|
|
120
|
+
request_timeout,
|
|
121
|
+
max_open_connections: config.max_open_connections ?? 10,
|
|
122
|
+
compression: {
|
|
123
|
+
decompress_response: normalizeResponseCompression(config.compression?.response),
|
|
124
|
+
compress_request: normalizeRequestCompression(config.compression?.request),
|
|
125
|
+
},
|
|
126
|
+
database: config.database ?? "default",
|
|
127
|
+
log_writer: new logger_1.LogWriter(logger, "Connection", log_level),
|
|
128
|
+
log_level: log_level,
|
|
129
|
+
keep_alive: { enabled: config.keep_alive?.enabled ?? true },
|
|
130
|
+
clickhouse_settings,
|
|
131
|
+
http_headers: config.http_headers ?? {},
|
|
132
|
+
json: {
|
|
133
|
+
...json_handling_1.defaultJSONHandling,
|
|
134
|
+
...config.json,
|
|
135
|
+
},
|
|
136
|
+
...(config.use_multipart_params ? { use_multipart_params: true } : {}),
|
|
137
|
+
...(config.use_multipart_params_auto
|
|
138
|
+
? { use_multipart_params_auto: true }
|
|
139
|
+
: {}),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Merge two versions of the config: base (hardcoded) from the instance creation and the URL parsed one.
|
|
144
|
+
* URL config takes priority and overrides the base config parameters.
|
|
145
|
+
* If a value is overridden, then a warning will be logged (even if the log level is OFF).
|
|
146
|
+
*/
|
|
147
|
+
function mergeConfigs(baseConfig, configFromURL, logger) {
|
|
148
|
+
function deepMerge(base, fromURL, path = []) {
|
|
149
|
+
for (const key of Object.keys(fromURL)) {
|
|
150
|
+
if (typeof fromURL[key] === "object") {
|
|
151
|
+
deepMerge(base, fromURL[key], path.concat(key));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
let baseAtPath = base;
|
|
155
|
+
for (const key of path) {
|
|
156
|
+
if (baseAtPath[key] === undefined) {
|
|
157
|
+
baseAtPath[key] = {};
|
|
158
|
+
}
|
|
159
|
+
baseAtPath = baseAtPath[key];
|
|
160
|
+
}
|
|
161
|
+
const baseAtKey = baseAtPath[key];
|
|
162
|
+
if (baseAtKey !== undefined) {
|
|
163
|
+
const fullPath = path.concat(key).join(".");
|
|
164
|
+
logger.warn({
|
|
165
|
+
module: "Config",
|
|
166
|
+
message: `"${fullPath}" is overridden by a URL parameter.`,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
baseAtPath[key] = fromURL[key];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const config = { ...baseConfig };
|
|
174
|
+
deepMerge(config, configFromURL);
|
|
175
|
+
return config;
|
|
176
|
+
}
|
|
177
|
+
function createUrl(configURL) {
|
|
178
|
+
let url;
|
|
179
|
+
try {
|
|
180
|
+
if (typeof configURL === "string" || configURL instanceof URL) {
|
|
181
|
+
url = new URL(configURL);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
return new URL("http://localhost:8123");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
throw new Error("ClickHouse URL is malformed. Expected format: http[s]://[username:password@]hostname:port[/database][?param1=value1¶m2=value2]", { cause: err });
|
|
189
|
+
}
|
|
190
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
191
|
+
throw new Error(`ClickHouse URL protocol must be either http or https. Got: ${url.protocol}`);
|
|
192
|
+
}
|
|
193
|
+
return url;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* @param url potentially contains auth, database and URL params to parse the configuration from
|
|
197
|
+
* @param handleExtraURLParams some platform-specific URL params might be unknown by the common package;
|
|
198
|
+
* use this function defined in the implementation to handle them. Logs warnings in case of hardcode overrides.
|
|
199
|
+
*/
|
|
200
|
+
function loadConfigOptionsFromURL(url, handleExtraURLParams) {
|
|
201
|
+
let config = {};
|
|
202
|
+
// trim is not needed, cause space is not allowed in the URL basic auth and should be encoded as %20
|
|
203
|
+
if (url.username !== "") {
|
|
204
|
+
config.username = decodeURIComponent(url.username);
|
|
205
|
+
}
|
|
206
|
+
if (url.password !== "") {
|
|
207
|
+
config.password = decodeURIComponent(url.password);
|
|
208
|
+
}
|
|
209
|
+
if (url.pathname.trim().length > 1) {
|
|
210
|
+
config.database = url.pathname.slice(1);
|
|
211
|
+
}
|
|
212
|
+
const urlSearchParamsKeys = [...url.searchParams.keys()];
|
|
213
|
+
if (urlSearchParamsKeys.length > 0) {
|
|
214
|
+
const unknownParams = new Set();
|
|
215
|
+
const settingPrefix = "clickhouse_setting_";
|
|
216
|
+
const settingShortPrefix = "ch_";
|
|
217
|
+
const httpHeaderPrefix = "http_header_";
|
|
218
|
+
urlSearchParamsKeys.forEach((key) => {
|
|
219
|
+
let paramWasProcessed = true;
|
|
220
|
+
const value = url.searchParams.get(key);
|
|
221
|
+
if (key.startsWith(settingPrefix)) {
|
|
222
|
+
// clickhouse_settings_*
|
|
223
|
+
const settingKey = key.slice(settingPrefix.length);
|
|
224
|
+
if (config.clickhouse_settings === undefined) {
|
|
225
|
+
config.clickhouse_settings = {};
|
|
226
|
+
}
|
|
227
|
+
config.clickhouse_settings[settingKey] = value;
|
|
228
|
+
}
|
|
229
|
+
else if (key.startsWith(settingShortPrefix)) {
|
|
230
|
+
// ch_*
|
|
231
|
+
const settingKey = key.slice(settingShortPrefix.length);
|
|
232
|
+
if (config.clickhouse_settings === undefined) {
|
|
233
|
+
config.clickhouse_settings = {};
|
|
234
|
+
}
|
|
235
|
+
config.clickhouse_settings[settingKey] = value;
|
|
236
|
+
}
|
|
237
|
+
else if (key.startsWith(httpHeaderPrefix)) {
|
|
238
|
+
// http_headers_*
|
|
239
|
+
const headerKey = key.slice(httpHeaderPrefix.length);
|
|
240
|
+
if (config.http_headers === undefined) {
|
|
241
|
+
config.http_headers = {};
|
|
242
|
+
}
|
|
243
|
+
config.http_headers[headerKey] = value;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
// static known parameters
|
|
247
|
+
switch (key) {
|
|
248
|
+
case "application":
|
|
249
|
+
config.application = value;
|
|
250
|
+
break;
|
|
251
|
+
case "pathname":
|
|
252
|
+
config.pathname = value;
|
|
253
|
+
break;
|
|
254
|
+
case "session_id":
|
|
255
|
+
config.session_id = value;
|
|
256
|
+
break;
|
|
257
|
+
case "request_timeout":
|
|
258
|
+
config.request_timeout = numberConfigURLValue({
|
|
259
|
+
key,
|
|
260
|
+
value,
|
|
261
|
+
min: 0,
|
|
262
|
+
});
|
|
263
|
+
break;
|
|
264
|
+
case "max_open_connections":
|
|
265
|
+
config.max_open_connections = numberConfigURLValue({
|
|
266
|
+
key,
|
|
267
|
+
value,
|
|
268
|
+
min: 1,
|
|
269
|
+
});
|
|
270
|
+
break;
|
|
271
|
+
case "compression_request":
|
|
272
|
+
if (config.compression === undefined) {
|
|
273
|
+
config.compression = {};
|
|
274
|
+
}
|
|
275
|
+
config.compression.request = booleanConfigURLValue({ key, value });
|
|
276
|
+
break;
|
|
277
|
+
case "compression_response":
|
|
278
|
+
if (config.compression === undefined) {
|
|
279
|
+
config.compression = {};
|
|
280
|
+
}
|
|
281
|
+
config.compression.response = booleanConfigURLValue({
|
|
282
|
+
key,
|
|
283
|
+
value,
|
|
284
|
+
});
|
|
285
|
+
break;
|
|
286
|
+
case "log_level":
|
|
287
|
+
if (config.log === undefined) {
|
|
288
|
+
config.log = {};
|
|
289
|
+
}
|
|
290
|
+
config.log.level = enumConfigURLValue({
|
|
291
|
+
key,
|
|
292
|
+
value,
|
|
293
|
+
enumObject: logger_1.ClickHouseLogLevel,
|
|
294
|
+
});
|
|
295
|
+
break;
|
|
296
|
+
case "keep_alive_enabled":
|
|
297
|
+
if (config.keep_alive === undefined) {
|
|
298
|
+
config.keep_alive = {};
|
|
299
|
+
}
|
|
300
|
+
config.keep_alive.enabled = booleanConfigURLValue({ key, value });
|
|
301
|
+
break;
|
|
302
|
+
case "access_token":
|
|
303
|
+
config.access_token = value;
|
|
304
|
+
break;
|
|
305
|
+
default:
|
|
306
|
+
paramWasProcessed = false;
|
|
307
|
+
unknownParams.add(key);
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (paramWasProcessed) {
|
|
312
|
+
// so it won't be passed to the impl URL params handler
|
|
313
|
+
url.searchParams.delete(key);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
if (handleExtraURLParams !== null) {
|
|
317
|
+
const res = handleExtraURLParams(config, url);
|
|
318
|
+
config = res.config;
|
|
319
|
+
if (unknownParams.size > 0) {
|
|
320
|
+
res.handled_params.forEach((k) => unknownParams.delete(k));
|
|
321
|
+
}
|
|
322
|
+
if (res.unknown_params.size > 0) {
|
|
323
|
+
res.unknown_params.forEach((k) => unknownParams.add(k));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (unknownParams.size > 0) {
|
|
327
|
+
throw new Error(`Unknown URL parameters: ${Array.from(unknownParams).join(", ")}`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// clean up the final ClickHouse URL to be used in the connection
|
|
331
|
+
const clickHouseURL = new URL(`${url.protocol}//${url.host}`);
|
|
332
|
+
return [clickHouseURL, config];
|
|
333
|
+
}
|
|
334
|
+
function booleanConfigURLValue({ key, value, }) {
|
|
335
|
+
const trimmed = value.trim();
|
|
336
|
+
if (trimmed === "true" || trimmed === "1")
|
|
337
|
+
return true;
|
|
338
|
+
if (trimmed === "false" || trimmed === "0")
|
|
339
|
+
return false;
|
|
340
|
+
throw new Error(`"${key}" has invalid boolean value: ${trimmed}. Expected one of: 0, 1, true, false.`);
|
|
341
|
+
}
|
|
342
|
+
function numberConfigURLValue({ key, value, min, max, }) {
|
|
343
|
+
const trimmed = value.trim();
|
|
344
|
+
const number = Number(trimmed);
|
|
345
|
+
if (isNaN(number))
|
|
346
|
+
throw new Error(`"${key}" has invalid numeric value: ${trimmed}`);
|
|
347
|
+
if (min !== undefined && number < min) {
|
|
348
|
+
throw new Error(`"${key}" value ${trimmed} is less than min allowed ${min}`);
|
|
349
|
+
}
|
|
350
|
+
if (max !== undefined && number > max) {
|
|
351
|
+
throw new Error(`"${key}" value ${trimmed} is greater than max allowed ${max}`);
|
|
352
|
+
}
|
|
353
|
+
return number;
|
|
354
|
+
}
|
|
355
|
+
function enumConfigURLValue({ key, value, enumObject, }) {
|
|
356
|
+
const values = Object.keys(enumObject).filter((item) => isNaN(Number(item)));
|
|
357
|
+
const trimmed = value.trim();
|
|
358
|
+
if (!values.includes(trimmed)) {
|
|
359
|
+
const expected = values.join(", ");
|
|
360
|
+
throw new Error(`"${key}" has invalid value: ${trimmed}. Expected one of: ${expected}.`);
|
|
361
|
+
}
|
|
362
|
+
return enumObject[trimmed];
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/common/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { JSONHandling } from ".";
|
|
2
|
+
import type { WithClickHouseSummary, WithHttpStatusCode, WithResponseHeaders } from "./clickhouse_types";
|
|
3
|
+
import type { ClickHouseLogLevel, LogWriter } from "./logger";
|
|
4
|
+
import type { ClickHouseSettings } from "./settings";
|
|
5
|
+
export type ConnectionAuth = {
|
|
6
|
+
username: string;
|
|
7
|
+
password: string;
|
|
8
|
+
type: "Credentials";
|
|
9
|
+
} | {
|
|
10
|
+
access_token: string;
|
|
11
|
+
type: "JWT";
|
|
12
|
+
};
|
|
13
|
+
export interface ConnectionParams {
|
|
14
|
+
url: URL;
|
|
15
|
+
request_timeout: number;
|
|
16
|
+
max_open_connections: number;
|
|
17
|
+
compression: CompressionSettings;
|
|
18
|
+
database: string;
|
|
19
|
+
clickhouse_settings: ClickHouseSettings;
|
|
20
|
+
log_writer: LogWriter;
|
|
21
|
+
log_level: ClickHouseLogLevel;
|
|
22
|
+
keep_alive: {
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
};
|
|
25
|
+
application_id?: string;
|
|
26
|
+
http_headers?: Record<string, string>;
|
|
27
|
+
auth: ConnectionAuth;
|
|
28
|
+
json?: JSONHandling;
|
|
29
|
+
use_multipart_params?: boolean;
|
|
30
|
+
use_multipart_params_auto?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Compression codecs supported for the HTTP request (insert) and response
|
|
33
|
+
* (read) bodies. `zstd` requires Node.js >= 22.15.0 (zstd support in the
|
|
34
|
+
* built-in `zlib` module); `br` (Brotli) is available on every supported
|
|
35
|
+
* Node.js version. Request-body compression is performed only by
|
|
36
|
+
* `@clickhouse/client` (Node.js); on the web client, response decompression is
|
|
37
|
+
* handled by the browser and only `zstd` is rejected. */
|
|
38
|
+
export type CompressionMethod = "gzip" | "zstd" | "br";
|
|
39
|
+
/** Normalized request (insert) body compression, discriminated by codec so each
|
|
40
|
+
* codec carries its own tuning option: a `level` for gzip/zstd, a `quality` for
|
|
41
|
+
* Brotli. */
|
|
42
|
+
export type RequestCompression = {
|
|
43
|
+
codec: "gzip";
|
|
44
|
+
level?: number;
|
|
45
|
+
} | {
|
|
46
|
+
codec: "zstd";
|
|
47
|
+
level?: number;
|
|
48
|
+
} | {
|
|
49
|
+
codec: "br";
|
|
50
|
+
quality?: number;
|
|
51
|
+
};
|
|
52
|
+
/** Normalized response (read) body compression. The compression options are
|
|
53
|
+
* chosen by the ClickHouse server, so none are carried here. */
|
|
54
|
+
export type ResponseCompression = {
|
|
55
|
+
codec: "gzip";
|
|
56
|
+
} | {
|
|
57
|
+
codec: "zstd";
|
|
58
|
+
} | {
|
|
59
|
+
codec: "br";
|
|
60
|
+
};
|
|
61
|
+
export interface CompressionSettings {
|
|
62
|
+
/** Response decompression codec, or `undefined` to disable. */
|
|
63
|
+
decompress_response: ResponseCompression | undefined;
|
|
64
|
+
/** Request compression codec (with an optional codec-specific level), or
|
|
65
|
+
* `undefined` to disable. */
|
|
66
|
+
compress_request: RequestCompression | undefined;
|
|
67
|
+
}
|
|
68
|
+
export interface ConnBaseQueryParams {
|
|
69
|
+
query: string;
|
|
70
|
+
clickhouse_settings?: ClickHouseSettings;
|
|
71
|
+
query_params?: Record<string, unknown>;
|
|
72
|
+
abort_signal?: AbortSignal;
|
|
73
|
+
session_id?: string;
|
|
74
|
+
query_id?: string;
|
|
75
|
+
auth?: {
|
|
76
|
+
username: string;
|
|
77
|
+
password: string;
|
|
78
|
+
} | {
|
|
79
|
+
access_token: string;
|
|
80
|
+
};
|
|
81
|
+
role?: string | Array<string>;
|
|
82
|
+
http_headers?: Record<string, string>;
|
|
83
|
+
use_multipart_params?: boolean;
|
|
84
|
+
use_multipart_params_auto?: boolean;
|
|
85
|
+
}
|
|
86
|
+
export type ConnPingParams = {
|
|
87
|
+
select: boolean;
|
|
88
|
+
} & Omit<ConnBaseQueryParams, "query" | "query_params">;
|
|
89
|
+
export interface ConnCommandParams extends ConnBaseQueryParams {
|
|
90
|
+
ignore_error_response?: boolean;
|
|
91
|
+
}
|
|
92
|
+
export interface ConnInsertParams<Stream> extends ConnBaseQueryParams {
|
|
93
|
+
values: string | Stream;
|
|
94
|
+
}
|
|
95
|
+
export interface ConnExecParams<Stream> extends ConnBaseQueryParams {
|
|
96
|
+
values?: Stream;
|
|
97
|
+
decompress_response_stream?: boolean;
|
|
98
|
+
ignore_error_response?: boolean;
|
|
99
|
+
}
|
|
100
|
+
export interface ConnBaseResult extends WithResponseHeaders, WithHttpStatusCode {
|
|
101
|
+
query_id: string;
|
|
102
|
+
}
|
|
103
|
+
export interface ConnQueryResult<Stream> extends ConnBaseResult {
|
|
104
|
+
stream: Stream;
|
|
105
|
+
query_id: string;
|
|
106
|
+
}
|
|
107
|
+
export type ConnInsertResult = ConnBaseResult & WithClickHouseSummary;
|
|
108
|
+
export type ConnExecResult<Stream> = ConnQueryResult<Stream> & WithClickHouseSummary;
|
|
109
|
+
export type ConnCommandResult = ConnBaseResult & WithClickHouseSummary;
|
|
110
|
+
export type ConnPingResult = {
|
|
111
|
+
success: true;
|
|
112
|
+
} | {
|
|
113
|
+
success: false;
|
|
114
|
+
error: Error;
|
|
115
|
+
};
|
|
116
|
+
export type ConnOperation = "Ping" | "Query" | "Insert" | "Exec" | "Command";
|
|
117
|
+
export interface Connection<Stream> {
|
|
118
|
+
ping(params: ConnPingParams): Promise<ConnPingResult>;
|
|
119
|
+
query(params: ConnBaseQueryParams): Promise<ConnQueryResult<Stream>>;
|
|
120
|
+
insert(params: ConnInsertParams<Stream>): Promise<ConnInsertResult>;
|
|
121
|
+
command(params: ConnCommandParams): Promise<ConnCommandResult>;
|
|
122
|
+
exec(params: ConnExecParams<Stream>): Promise<ConnExecResult<Stream>>;
|
|
123
|
+
close(): Promise<void>;
|
|
124
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/common/connection.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class TupleParam {
|
|
2
|
+
readonly values: readonly unknown[];
|
|
3
|
+
constructor(values: readonly unknown[]);
|
|
4
|
+
}
|
|
5
|
+
export declare function formatQueryParams({ value, wrapStringInQuotes, printNullAsKeyword, }: FormatQueryParamsOptions): string;
|
|
6
|
+
interface FormatQueryParamsOptions {
|
|
7
|
+
value: unknown;
|
|
8
|
+
wrapStringInQuotes?: boolean;
|
|
9
|
+
printNullAsKeyword?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TupleParam = void 0;
|
|
4
|
+
exports.formatQueryParams = formatQueryParams;
|
|
5
|
+
class TupleParam {
|
|
6
|
+
values;
|
|
7
|
+
constructor(values) {
|
|
8
|
+
this.values = values;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.TupleParam = TupleParam;
|
|
12
|
+
function formatQueryParams({ value, wrapStringInQuotes, printNullAsKeyword, }) {
|
|
13
|
+
return formatQueryParamsInternal({
|
|
14
|
+
value,
|
|
15
|
+
wrapStringInQuotes,
|
|
16
|
+
printNullAsKeyword,
|
|
17
|
+
isInArrayOrTuple: false,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function formatQueryParamsInternal({ value, wrapStringInQuotes, printNullAsKeyword, isInArrayOrTuple, }) {
|
|
21
|
+
if (value === null || value === undefined) {
|
|
22
|
+
if (printNullAsKeyword)
|
|
23
|
+
return "NULL";
|
|
24
|
+
return "\\N";
|
|
25
|
+
}
|
|
26
|
+
if (Number.isNaN(value))
|
|
27
|
+
return "nan";
|
|
28
|
+
if (value === Number.POSITIVE_INFINITY)
|
|
29
|
+
return "+inf";
|
|
30
|
+
if (value === Number.NEGATIVE_INFINITY)
|
|
31
|
+
return "-inf";
|
|
32
|
+
if (typeof value === "number" || typeof value === "bigint")
|
|
33
|
+
return String(value);
|
|
34
|
+
if (typeof value === "boolean") {
|
|
35
|
+
if (isInArrayOrTuple) {
|
|
36
|
+
return value ? "TRUE" : "FALSE";
|
|
37
|
+
}
|
|
38
|
+
return value ? "1" : "0";
|
|
39
|
+
}
|
|
40
|
+
if (typeof value === "string") {
|
|
41
|
+
let result = "";
|
|
42
|
+
for (let i = 0; i < value.length; i++) {
|
|
43
|
+
switch (value.charCodeAt(i)) {
|
|
44
|
+
case TabASCII:
|
|
45
|
+
result += "\\t";
|
|
46
|
+
break;
|
|
47
|
+
case NewlineASCII:
|
|
48
|
+
result += "\\n";
|
|
49
|
+
break;
|
|
50
|
+
case CarriageReturnASCII:
|
|
51
|
+
result += "\\r";
|
|
52
|
+
break;
|
|
53
|
+
case SingleQuoteASCII:
|
|
54
|
+
result += `\\'`;
|
|
55
|
+
break;
|
|
56
|
+
case BackslashASCII:
|
|
57
|
+
result += "\\\\";
|
|
58
|
+
break;
|
|
59
|
+
default:
|
|
60
|
+
result += value[i];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return wrapStringInQuotes ? `'${result}'` : result;
|
|
64
|
+
}
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
return `[${value
|
|
67
|
+
.map((v) => formatQueryParamsInternal({
|
|
68
|
+
value: v,
|
|
69
|
+
wrapStringInQuotes: true,
|
|
70
|
+
printNullAsKeyword: true,
|
|
71
|
+
isInArrayOrTuple: true,
|
|
72
|
+
}))
|
|
73
|
+
.join(",")}]`;
|
|
74
|
+
}
|
|
75
|
+
if (value instanceof Date) {
|
|
76
|
+
// The ClickHouse server parses numbers as time-zone-agnostic Unix timestamps
|
|
77
|
+
const unixTimestamp = Math.floor(value.getTime() / 1000)
|
|
78
|
+
.toString()
|
|
79
|
+
.padStart(10, "0");
|
|
80
|
+
const milliseconds = value.getUTCMilliseconds();
|
|
81
|
+
return milliseconds === 0
|
|
82
|
+
? unixTimestamp
|
|
83
|
+
: `${unixTimestamp}.${milliseconds.toString().padStart(3, "0")}`;
|
|
84
|
+
}
|
|
85
|
+
// (42,'foo',NULL)
|
|
86
|
+
if (value instanceof TupleParam) {
|
|
87
|
+
return `(${value.values
|
|
88
|
+
.map((v) => formatQueryParamsInternal({
|
|
89
|
+
value: v,
|
|
90
|
+
wrapStringInQuotes: true,
|
|
91
|
+
printNullAsKeyword: true,
|
|
92
|
+
isInArrayOrTuple: true,
|
|
93
|
+
}))
|
|
94
|
+
.join(",")})`;
|
|
95
|
+
}
|
|
96
|
+
if (value instanceof Map) {
|
|
97
|
+
return formatObjectLikeParam(value.entries());
|
|
98
|
+
}
|
|
99
|
+
// This is only useful for simple maps where the keys are strings
|
|
100
|
+
if (typeof value === "object") {
|
|
101
|
+
return formatObjectLikeParam(Object.entries(value));
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Unsupported value in query parameters: [${value}].`);
|
|
104
|
+
}
|
|
105
|
+
// {'key1':'value1',42:'value2'}
|
|
106
|
+
function formatObjectLikeParam(entries) {
|
|
107
|
+
const formatted = [];
|
|
108
|
+
for (const [key, val] of entries) {
|
|
109
|
+
formatted.push(`${formatQueryParamsInternal({
|
|
110
|
+
value: key,
|
|
111
|
+
wrapStringInQuotes: true,
|
|
112
|
+
printNullAsKeyword: true,
|
|
113
|
+
isInArrayOrTuple: true,
|
|
114
|
+
})}:${formatQueryParamsInternal({
|
|
115
|
+
value: val,
|
|
116
|
+
wrapStringInQuotes: true,
|
|
117
|
+
printNullAsKeyword: true,
|
|
118
|
+
isInArrayOrTuple: true,
|
|
119
|
+
})}`);
|
|
120
|
+
}
|
|
121
|
+
return `{${formatted.join(",")}}`;
|
|
122
|
+
}
|
|
123
|
+
const TabASCII = 9;
|
|
124
|
+
const NewlineASCII = 10;
|
|
125
|
+
const CarriageReturnASCII = 13;
|
|
126
|
+
const SingleQuoteASCII = 39;
|
|
127
|
+
const BackslashASCII = 92;
|
|
128
|
+
//# sourceMappingURL=format_query_params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format_query_params.js","sourceRoot":"","sources":["../../../src/common/data_formatter/format_query_params.ts"],"names":[],"mappings":"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"}
|