@clickhouse/client-common 1.20.0 → 1.21.0-head.68dd619.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.
Files changed (62) hide show
  1. package/README.md +11 -11
  2. package/dist/clickhouse_types.js +6 -6
  3. package/dist/clickhouse_types.js.map +1 -1
  4. package/dist/client.d.ts +19 -9
  5. package/dist/client.js +231 -43
  6. package/dist/client.js.map +1 -1
  7. package/dist/config.d.ts +54 -10
  8. package/dist/config.js +42 -38
  9. package/dist/config.js.map +1 -1
  10. package/dist/connection.d.ts +12 -8
  11. package/dist/data_formatter/format_query_params.js +21 -21
  12. package/dist/data_formatter/format_query_params.js.map +1 -1
  13. package/dist/data_formatter/format_query_settings.d.ts +1 -1
  14. package/dist/data_formatter/format_query_settings.js +4 -4
  15. package/dist/data_formatter/format_query_settings.js.map +1 -1
  16. package/dist/data_formatter/formatter.d.ts +2 -2
  17. package/dist/data_formatter/formatter.js +28 -28
  18. package/dist/data_formatter/formatter.js.map +1 -1
  19. package/dist/data_formatter/index.d.ts +3 -3
  20. package/dist/data_formatter/index.js.map +1 -1
  21. package/dist/error/error.js +18 -4
  22. package/dist/error/error.js.map +1 -1
  23. package/dist/error/index.d.ts +1 -1
  24. package/dist/error/index.js.map +1 -1
  25. package/dist/index.d.ts +21 -20
  26. package/dist/index.js +10 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/logger.d.ts +29 -14
  29. package/dist/logger.js +40 -27
  30. package/dist/logger.js.map +1 -1
  31. package/dist/parse/column_types.d.ts +10 -10
  32. package/dist/parse/column_types.js +97 -92
  33. package/dist/parse/column_types.js.map +1 -1
  34. package/dist/parse/index.d.ts +2 -2
  35. package/dist/parse/index.js.map +1 -1
  36. package/dist/parse/json_handling.js.map +1 -1
  37. package/dist/result.d.ts +4 -4
  38. package/dist/settings.d.ts +47 -30
  39. package/dist/settings.js +1 -1
  40. package/dist/settings.js.map +1 -1
  41. package/dist/tracing.d.ts +146 -0
  42. package/dist/tracing.js +76 -0
  43. package/dist/tracing.js.map +1 -0
  44. package/dist/utils/connection.d.ts +1 -1
  45. package/dist/utils/connection.js +7 -7
  46. package/dist/utils/connection.js.map +1 -1
  47. package/dist/utils/index.d.ts +5 -4
  48. package/dist/utils/index.js +1 -0
  49. package/dist/utils/index.js.map +1 -1
  50. package/dist/utils/multipart.d.ts +34 -0
  51. package/dist/utils/multipart.js +81 -0
  52. package/dist/utils/multipart.js.map +1 -0
  53. package/dist/utils/sleep.js.map +1 -1
  54. package/dist/utils/stream.js +4 -4
  55. package/dist/utils/stream.js.map +1 -1
  56. package/dist/utils/url.d.ts +5 -2
  57. package/dist/utils/url.js +21 -16
  58. package/dist/utils/url.js.map +1 -1
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/dist/version.js.map +1 -1
  62. package/package.json +1 -1
package/README.md CHANGED
@@ -84,23 +84,23 @@ The client may work with older versions too; however, this is best-effort suppor
84
84
  ## Quick start
85
85
 
86
86
  ```ts
87
- import { createClient } from '@clickhouse/client' // or '@clickhouse/client-web'
87
+ import { createClient } from "@clickhouse/client"; // or '@clickhouse/client-web'
88
88
 
89
89
  const client = createClient({
90
- url: process.env.CLICKHOUSE_URL ?? 'http://localhost:8123',
91
- username: process.env.CLICKHOUSE_USER ?? 'default',
92
- password: process.env.CLICKHOUSE_PASSWORD ?? '',
93
- })
90
+ url: process.env.CLICKHOUSE_URL ?? "http://localhost:8123",
91
+ username: process.env.CLICKHOUSE_USER ?? "default",
92
+ password: process.env.CLICKHOUSE_PASSWORD ?? "",
93
+ });
94
94
 
95
95
  const resultSet = await client.query({
96
- query: 'SELECT * FROM system.tables',
97
- format: 'JSONEachRow',
98
- })
96
+ query: "SELECT * FROM system.tables",
97
+ format: "JSONEachRow",
98
+ });
99
99
 
100
- const tables = await resultSet.json()
101
- console.log(tables)
100
+ const tables = await resultSet.json();
101
+ console.log(tables);
102
102
 
103
- await client.close()
103
+ await client.close();
104
104
  ```
105
105
 
106
106
  See more examples in the [examples directory](./examples).
@@ -7,24 +7,24 @@ exports.isException = isException;
7
7
  * @see https://clickhouse.com/docs/interfaces/formats/JSONEachRowWithProgress */
8
8
  function isProgressRow(row) {
9
9
  return (row !== null &&
10
- typeof row === 'object' &&
11
- 'progress' in row &&
10
+ typeof row === "object" &&
11
+ "progress" in row &&
12
12
  Object.keys(row).length === 1);
13
13
  }
14
14
  /** Type guard to use with `JSONEachRowWithProgress`, checking if the emitted row is a row with data.
15
15
  * @see https://clickhouse.com/docs/interfaces/formats/JSONEachRowWithProgress */
16
16
  function isRow(row) {
17
17
  return (row !== null &&
18
- typeof row === 'object' &&
19
- 'row' in row &&
18
+ typeof row === "object" &&
19
+ "row" in row &&
20
20
  Object.keys(row).length === 1);
21
21
  }
22
22
  /** Type guard to use with `JSONEachRowWithProgress`, checking if the row contains an exception.
23
23
  * @see https://clickhouse.com/docs/interfaces/formats/JSONEachRowWithProgress */
24
24
  function isException(row) {
25
25
  return (row !== null &&
26
- typeof row === 'object' &&
27
- 'exception' in row &&
26
+ typeof row === "object" &&
27
+ "exception" in row &&
28
28
  Object.keys(row).length === 1);
29
29
  }
30
30
  //# sourceMappingURL=clickhouse_types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clickhouse_types.js","sourceRoot":"","sources":["../src/clickhouse_types.ts"],"names":[],"mappings":";;AAyFA,sCAOC;AAID,sBAOC;AAID,kCAOC;AA/BD;kFACkF;AAClF,SAAgB,aAAa,CAAC,GAAY;IACxC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,UAAU,IAAI,GAAG;QACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAA;AACH,CAAC;AAED;kFACkF;AAClF,SAAgB,KAAK,CAAI,GAAY;IACnC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,KAAK,IAAI,GAAG;QACZ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAA;AACH,CAAC;AAED;kFACkF;AAClF,SAAgB,WAAW,CAAC,GAAY;IACtC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,WAAW,IAAI,GAAG;QAClB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"clickhouse_types.js","sourceRoot":"","sources":["../src/clickhouse_types.ts"],"names":[],"mappings":";;AAyFA,sCAOC;AAID,sBAOC;AAID,kCAOC;AA/BD;kFACkF;AAClF,SAAgB,aAAa,CAAC,GAAY;IACxC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,UAAU,IAAI,GAAG;QACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED;kFACkF;AAClF,SAAgB,KAAK,CAAI,GAAY;IACnC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,KAAK,IAAI,GAAG;QACZ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED;kFACkF;AAClF,SAAgB,WAAW,CAAC,GAAY;IACtC,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,WAAW,IAAI,GAAG;QAClB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC"}
package/dist/client.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import type { BaseClickHouseClientConfigOptions, ClickHouseSettings, ConnExecResult, IsSame, WithClickHouseSummary, WithResponseHeaders, DataFormat } from './index';
2
- import type { InsertValues, NonEmptyArray, WithHttpStatusCode } from './clickhouse_types';
3
- import type { ImplementationDetails } from './config';
4
- import type { ConnPingResult } from './connection';
5
- import type { BaseResultSet } from './result';
1
+ import type { BaseClickHouseClientConfigOptions, ClickHouseSettings, ConnExecResult, IsSame, WithClickHouseSummary, WithResponseHeaders, DataFormat } from "./index";
2
+ import type { InsertValues, NonEmptyArray, WithHttpStatusCode } from "./clickhouse_types";
3
+ import type { ImplementationDetails } from "./config";
4
+ import type { ConnPingResult } from "./connection";
5
+ import type { BaseResultSet } from "./result";
6
6
  export interface BaseQueryParams {
7
7
  /** ClickHouse's settings that can be applied on query level. */
8
8
  clickhouse_settings?: ClickHouseSettings;
@@ -33,6 +33,14 @@ export interface BaseQueryParams {
33
33
  * Overrides the headers set in {@link BaseClickHouseClientConfigOptions.http_headers}.
34
34
  * @default empty object */
35
35
  http_headers?: Record<string, string>;
36
+ /** When defined, overrides {@link BaseClickHouseClientConfigOptions.use_multipart_params}
37
+ * for this particular request.
38
+ * @default undefined (no override) */
39
+ use_multipart_params?: boolean;
40
+ /** When defined, overrides {@link BaseClickHouseClientConfigOptions.use_multipart_params_auto}
41
+ * for this particular request.
42
+ * @default undefined (no override) */
43
+ use_multipart_params_auto?: boolean;
36
44
  }
37
45
  export interface QueryParams extends BaseQueryParams {
38
46
  /** Statement to execute. */
@@ -41,7 +49,7 @@ export interface QueryParams extends BaseQueryParams {
41
49
  format?: DataFormat;
42
50
  }
43
51
  /** Same parameters as {@link QueryParams}, but with `format` field as a type */
44
- export type QueryParamsWithFormat<Format extends DataFormat> = Omit<QueryParams, 'format'> & {
52
+ export type QueryParamsWithFormat<Format extends DataFormat> = Omit<QueryParams, "format"> & {
45
53
  format?: Format;
46
54
  };
47
55
  /** If the Format is not a literal type, fall back to the default behavior of the ResultSet,
@@ -128,14 +136,14 @@ export interface InsertParams<Stream = unknown, T = unknown> extends BaseQueryPa
128
136
  * This is the default behavior for the Node.js version. */
129
137
  export type PingParamsWithEndpoint = {
130
138
  select: false;
131
- } & Pick<BaseQueryParams, 'abort_signal' | 'http_headers'>;
139
+ } & Pick<BaseQueryParams, "abort_signal" | "http_headers">;
132
140
  /** Parameters for the health-check request - using a SELECT query.
133
141
  * This is the default behavior for the Web version, as the `/ping` endpoint does not support CORS.
134
142
  * Most of the standard `query` method params, e.g., `query_id`, `abort_signal`, `http_headers`, etc. will work,
135
143
  * except for `query_params`, which does not make sense to allow in this method. */
136
144
  export type PingParamsWithSelectQuery = {
137
145
  select: true;
138
- } & Omit<BaseQueryParams, 'query_params'>;
146
+ } & Omit<BaseQueryParams, "query_params">;
139
147
  export type PingParams = PingParamsWithEndpoint | PingParamsWithSelectQuery;
140
148
  export type PingResult = ConnPingResult;
141
149
  export declare class ClickHouseClient<Stream = unknown> {
@@ -147,6 +155,7 @@ export declare class ClickHouseClient<Stream = unknown> {
147
155
  private readonly sessionId?;
148
156
  private readonly role?;
149
157
  private readonly jsonHandling;
158
+ private readonly tracer;
150
159
  constructor(config: BaseClickHouseClientConfigOptions & ImplementationDetails<Stream>);
151
160
  /**
152
161
  * Used for most statements that can have a response, such as `SELECT`.
@@ -165,7 +174,7 @@ export declare class ClickHouseClient<Stream = unknown> {
165
174
  *
166
175
  * See {@link DataFormat} for the formats supported by the client.
167
176
  */
168
- query<Format extends DataFormat = 'JSON'>(params: QueryParamsWithFormat<Format>): Promise<QueryResult<Stream, Format>>;
177
+ query<Format extends DataFormat = "JSON">(params: QueryParamsWithFormat<Format>): Promise<QueryResult<Stream, Format>>;
169
178
  /**
170
179
  * It should be used for statements that do not have any output,
171
180
  * when the format clause is not applicable, or when you are not interested in the response at all.
@@ -219,5 +228,6 @@ export declare class ClickHouseClient<Stream = unknown> {
219
228
  * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/using
220
229
  */
221
230
  [Symbol.asyncDispose](): Promise<void>;
231
+ private withBaseSpanAttributes;
222
232
  private withClientQueryParams;
223
233
  }
package/dist/client.js CHANGED
@@ -4,6 +4,7 @@ exports.ClickHouseClient = void 0;
4
4
  const parse_1 = require("./parse");
5
5
  const logger_1 = require("./logger");
6
6
  const config_1 = require("./config");
7
+ const tracing_1 = require("./tracing");
7
8
  class ClickHouseClient {
8
9
  clientClickHouseSettings;
9
10
  connectionParams;
@@ -13,6 +14,7 @@ class ClickHouseClient {
13
14
  sessionId;
14
15
  role;
15
16
  jsonHandling;
17
+ tracer;
16
18
  constructor(config) {
17
19
  const logger = config?.log?.LoggerClass
18
20
  ? new config.log.LoggerClass()
@@ -31,6 +33,9 @@ class ClickHouseClient {
31
33
  ...config.json,
32
34
  };
33
35
  this.valuesEncoder = config.impl.values_encoder(this.jsonHandling);
36
+ // Assigned once at client creation: when no tracer is configured, the
37
+ // shared no-op tracer keeps the hot path branch-free.
38
+ this.tracer = config.tracer ?? tracing_1.NoopClickHouseTracer;
34
39
  }
35
40
  /**
36
41
  * Used for most statements that can have a response, such as `SELECT`.
@@ -50,28 +55,67 @@ class ClickHouseClient {
50
55
  * See {@link DataFormat} for the formats supported by the client.
51
56
  */
52
57
  async query(params) {
53
- const format = params.format ?? 'JSON';
58
+ const format = params.format ?? "JSON";
54
59
  const query = formatQuery(params.query, format);
55
60
  const queryParams = this.withClientQueryParams(params);
56
- const { stream, query_id, response_headers } = await this.connection.query({
57
- query,
58
- ...queryParams,
59
- });
60
61
  const { log_writer, log_level } = this.connectionParams;
61
- return this.makeResultSet(stream, format, query_id, (err) => {
62
- if (log_level <= logger_1.ClickHouseLogLevel.ERROR) {
63
- log_writer.error({
64
- err,
65
- module: 'Client',
66
- message: 'Error while processing the ResultSet.',
67
- args: {
68
- session_id: queryParams.session_id,
69
- role: queryParams.role,
70
- query_id,
71
- },
62
+ return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.query, {
63
+ kind: tracing_1.ClickHouseSpanKind.CLIENT,
64
+ attributes: this.withBaseSpanAttributes({
65
+ "clickhouse.response.format": format,
66
+ "clickhouse.request.query_id": queryParams.query_id,
67
+ "clickhouse.request.session_id": queryParams.session_id,
68
+ }),
69
+ }, async (span) => {
70
+ let queryResult;
71
+ try {
72
+ queryResult = await this.connection.query({
73
+ query,
74
+ ...queryParams,
72
75
  });
73
76
  }
74
- }, response_headers, this.jsonHandling);
77
+ catch (err) {
78
+ (0, tracing_1.recordSpanError)(span, err);
79
+ span.end();
80
+ throw err;
81
+ }
82
+ const { stream, query_id, response_headers, http_status_code } = queryResult;
83
+ // The query_id may have been generated by the connection layer.
84
+ span.setAttributes({ "clickhouse.request.query_id": query_id });
85
+ setResponseSpanAttributes(span, { http_status_code });
86
+ // The clickhouse.query span covers the HTTP request lifetime only:
87
+ // it ends here, once response headers are received. A separate
88
+ // clickhouse.query.stream child span is started and handed to the
89
+ // ResultSet to track the response stream consumption (decoded bytes,
90
+ // returned rows, streaming errors). Separating the two spans makes
91
+ // it easy to distinguish the original request duration from a stream
92
+ // that may never end (e.g. tailing a live table).
93
+ span.end();
94
+ return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.query_stream, { kind: tracing_1.ClickHouseSpanKind.CLIENT }, (streamSpan) => {
95
+ try {
96
+ return this.makeResultSet(stream, format, query_id, (err) => {
97
+ if (log_level <= logger_1.ClickHouseLogLevel.ERROR) {
98
+ log_writer.error({
99
+ err,
100
+ module: "Client",
101
+ message: "Error while processing the ResultSet.",
102
+ args: {
103
+ session_id: queryParams.session_id,
104
+ role: queryParams.role,
105
+ query_id,
106
+ },
107
+ });
108
+ }
109
+ }, response_headers, this.jsonHandling, streamSpan);
110
+ }
111
+ catch (err) {
112
+ (0, tracing_1.recordSpanError)(streamSpan, err);
113
+ streamSpan.end();
114
+ throw err;
115
+ }
116
+ // streamSpan is NOT ended here - the ResultSet owns its lifetime.
117
+ });
118
+ });
75
119
  }
76
120
  /**
77
121
  * It should be used for statements that do not have any output,
@@ -86,10 +130,32 @@ class ClickHouseClient {
86
130
  const query = removeTrailingSemi(params.query.trim());
87
131
  const ignore_error_response = params.ignore_error_response ?? false;
88
132
  const queryParams = this.withClientQueryParams(params);
89
- return await this.connection.command({
90
- query,
91
- ignore_error_response,
92
- ...queryParams,
133
+ return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.command, {
134
+ kind: tracing_1.ClickHouseSpanKind.CLIENT,
135
+ attributes: this.withBaseSpanAttributes({
136
+ "clickhouse.request.query_id": queryParams.query_id,
137
+ "clickhouse.request.session_id": queryParams.session_id,
138
+ }),
139
+ }, async (span) => {
140
+ try {
141
+ const result = await this.connection.command({
142
+ query,
143
+ ignore_error_response,
144
+ ...queryParams,
145
+ });
146
+ span.setAttributes({
147
+ "clickhouse.request.query_id": result.query_id,
148
+ });
149
+ setResponseSpanAttributes(span, result);
150
+ return result;
151
+ }
152
+ catch (err) {
153
+ (0, tracing_1.recordSpanError)(span, err);
154
+ throw err;
155
+ }
156
+ finally {
157
+ span.end();
158
+ }
93
159
  });
94
160
  }
95
161
  /**
@@ -102,16 +168,38 @@ class ClickHouseClient {
102
168
  */
103
169
  async exec(params) {
104
170
  const query = removeTrailingSemi(params.query.trim());
105
- const values = 'values' in params ? params.values : undefined;
171
+ const values = "values" in params ? params.values : undefined;
106
172
  const decompress_response_stream = params.decompress_response_stream ?? true;
107
173
  const ignore_error_response = params.ignore_error_response ?? false;
108
174
  const queryParams = this.withClientQueryParams(params);
109
- return await this.connection.exec({
110
- query,
111
- values,
112
- decompress_response_stream,
113
- ignore_error_response,
114
- ...queryParams,
175
+ return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.exec, {
176
+ kind: tracing_1.ClickHouseSpanKind.CLIENT,
177
+ attributes: this.withBaseSpanAttributes({
178
+ "clickhouse.request.query_id": queryParams.query_id,
179
+ "clickhouse.request.session_id": queryParams.session_id,
180
+ }),
181
+ }, async (span) => {
182
+ try {
183
+ const result = await this.connection.exec({
184
+ query,
185
+ values,
186
+ decompress_response_stream,
187
+ ignore_error_response,
188
+ ...queryParams,
189
+ });
190
+ span.setAttributes({
191
+ "clickhouse.request.query_id": result.query_id,
192
+ });
193
+ setResponseSpanAttributes(span, result);
194
+ return result;
195
+ }
196
+ catch (err) {
197
+ (0, tracing_1.recordSpanError)(span, err);
198
+ throw err;
199
+ }
200
+ finally {
201
+ span.end();
202
+ }
115
203
  });
116
204
  }
117
205
  /**
@@ -125,18 +213,55 @@ class ClickHouseClient {
125
213
  */
126
214
  async insert(params) {
127
215
  if (Array.isArray(params.values) && params.values.length === 0) {
128
- return { executed: false, query_id: '', response_headers: {} };
216
+ return { executed: false, query_id: "", response_headers: {} };
129
217
  }
130
- const format = params.format || 'JSONCompactEachRow';
218
+ const format = params.format || "JSONCompactEachRow";
131
219
  this.valuesEncoder.validateInsertValues(params.values, format);
132
220
  const query = getInsertQuery(params, format);
133
221
  const queryParams = this.withClientQueryParams(params);
134
- const result = await this.connection.insert({
135
- query,
136
- values: this.valuesEncoder.encodeValues(params.values, format),
137
- ...queryParams,
222
+ return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.insert, {
223
+ kind: tracing_1.ClickHouseSpanKind.CLIENT,
224
+ attributes: this.withBaseSpanAttributes({
225
+ "db.operation.name": "INSERT",
226
+ "db.collection.name": params.table,
227
+ "clickhouse.request.format": format,
228
+ "clickhouse.request.query_id": queryParams.query_id,
229
+ "clickhouse.request.session_id": queryParams.session_id,
230
+ // Only known up front for array-based inserts; for streamed
231
+ // inserts, the row count is not observable by the client.
232
+ "clickhouse.request.sent_rows": Array.isArray(params.values)
233
+ ? params.values.length
234
+ : undefined,
235
+ }),
236
+ }, async (span) => {
237
+ try {
238
+ const values = this.valuesEncoder.encodeValues(params.values, format);
239
+ // TODO: record `clickhouse.request.encoded_bytes` (the
240
+ // pre-compression request body size) here. This is a
241
+ // post-common-deprecation feature: once `client-common` is
242
+ // deprecated and the Node.js / Web clients are fully independent,
243
+ // each client can measure the encoded payload using its own
244
+ // platform-native byte-length primitive (e.g. `Buffer.byteLength`)
245
+ // instead of a hand-rolled common implementation.
246
+ const result = await this.connection.insert({
247
+ query,
248
+ values,
249
+ ...queryParams,
250
+ });
251
+ span.setAttributes({
252
+ "clickhouse.request.query_id": result.query_id,
253
+ });
254
+ setResponseSpanAttributes(span, result);
255
+ return { ...result, executed: true };
256
+ }
257
+ catch (err) {
258
+ (0, tracing_1.recordSpanError)(span, err);
259
+ throw err;
260
+ }
261
+ finally {
262
+ span.end();
263
+ }
138
264
  });
139
- return { ...result, executed: true };
140
265
  }
141
266
  /**
142
267
  * A health-check request. It does not throw if an error occurs - the error is returned inside the result object.
@@ -148,7 +273,24 @@ class ClickHouseClient {
148
273
  * **NOTE**: Since the `/ping` endpoint does not support CORS, the Web version always uses a `SELECT` query.
149
274
  */
150
275
  async ping(params) {
151
- return await this.connection.ping(params ?? { select: false });
276
+ const select = params?.select ?? false;
277
+ return this.tracer.startActiveSpan(tracing_1.ClickHouseSpanNames.ping, {
278
+ kind: tracing_1.ClickHouseSpanKind.CLIENT,
279
+ attributes: this.withBaseSpanAttributes({
280
+ "clickhouse.ping.select": select,
281
+ }),
282
+ }, async (span) => {
283
+ try {
284
+ return await this.connection.ping(params ?? { select: false });
285
+ }
286
+ catch (err) {
287
+ (0, tracing_1.recordSpanError)(span, err);
288
+ throw err;
289
+ }
290
+ finally {
291
+ span.end();
292
+ }
293
+ });
152
294
  }
153
295
  /**
154
296
  * Shuts down the underlying connection.
@@ -168,6 +310,23 @@ class ClickHouseClient {
168
310
  async [Symbol.asyncDispose]() {
169
311
  await this.close();
170
312
  }
313
+ withBaseSpanAttributes(extra) {
314
+ const url = this.connectionParams.url;
315
+ const attrs = {
316
+ "db.system.name": "clickhouse",
317
+ "server.address": url.hostname,
318
+ "server.port": getServerPort(url),
319
+ "db.namespace": this.connectionParams.database,
320
+ };
321
+ if (this.connectionParams.application_id !== undefined) {
322
+ attrs["clickhouse.application"] = this.connectionParams.application_id;
323
+ }
324
+ for (const [k, v] of Object.entries(extra)) {
325
+ if (v !== undefined)
326
+ attrs[k] = v;
327
+ }
328
+ return attrs;
329
+ }
171
330
  withClientQueryParams(params) {
172
331
  return {
173
332
  clickhouse_settings: {
@@ -181,19 +340,48 @@ class ClickHouseClient {
181
340
  role: params.role ?? this.role,
182
341
  auth: params.auth,
183
342
  http_headers: params.http_headers,
343
+ use_multipart_params: params.use_multipart_params,
344
+ use_multipart_params_auto: params.use_multipart_params_auto,
184
345
  };
185
346
  }
186
347
  }
187
348
  exports.ClickHouseClient = ClickHouseClient;
349
+ function getServerPort(url) {
350
+ if (url.port !== "") {
351
+ return Number(url.port);
352
+ }
353
+ return url.protocol === "https:" ? 443 : 80;
354
+ }
355
+ /** Records HTTP status and `X-ClickHouse-Summary` counters on the span once
356
+ * the response (headers) arrived. The summary values are complete only when
357
+ * the query was executed with `wait_end_of_query=1`; see
358
+ * {@link ClickHouseSummary}. */
359
+ function setResponseSpanAttributes(span, result) {
360
+ const attributes = {};
361
+ if (result.http_status_code !== undefined) {
362
+ attributes["db.response.status_code"] = result.http_status_code;
363
+ }
364
+ const summary = result.summary;
365
+ if (summary !== undefined) {
366
+ attributes["clickhouse.summary.read_rows"] = summary.read_rows;
367
+ attributes["clickhouse.summary.read_bytes"] = summary.read_bytes;
368
+ attributes["clickhouse.summary.written_rows"] = summary.written_rows;
369
+ attributes["clickhouse.summary.written_bytes"] = summary.written_bytes;
370
+ attributes["clickhouse.summary.result_rows"] = summary.result_rows;
371
+ attributes["clickhouse.summary.result_bytes"] = summary.result_bytes;
372
+ attributes["clickhouse.summary.elapsed_ns"] = summary.elapsed_ns;
373
+ }
374
+ span.setAttributes(attributes);
375
+ }
188
376
  function formatQuery(query, format) {
189
377
  query = query.trim();
190
378
  query = removeTrailingSemi(query);
191
- return query + ' \nFORMAT ' + format;
379
+ return query + " \nFORMAT " + format;
192
380
  }
193
381
  function removeTrailingSemi(query) {
194
382
  let lastNonSemiIdx = query.length;
195
383
  for (let i = lastNonSemiIdx; i > 0; i--) {
196
- if (query[i - 1] !== ';') {
384
+ if (query[i - 1] !== ";") {
197
385
  lastNonSemiIdx = i;
198
386
  break;
199
387
  }
@@ -206,19 +394,19 @@ function removeTrailingSemi(query) {
206
394
  function isInsertColumnsExcept(obj) {
207
395
  return (obj !== undefined &&
208
396
  obj !== null &&
209
- typeof obj === 'object' &&
397
+ typeof obj === "object" &&
210
398
  // Avoiding ESLint no-prototype-builtins error
211
- Object.prototype.hasOwnProperty.call(obj, 'except'));
399
+ Object.prototype.hasOwnProperty.call(obj, "except"));
212
400
  }
213
401
  function getInsertQuery(params, format) {
214
- let columnsPart = '';
402
+ let columnsPart = "";
215
403
  if (params.columns !== undefined) {
216
404
  if (Array.isArray(params.columns) && params.columns.length > 0) {
217
- columnsPart = ` (${params.columns.join(', ')})`;
405
+ columnsPart = ` (${params.columns.join(", ")})`;
218
406
  }
219
407
  else if (isInsertColumnsExcept(params.columns) &&
220
408
  params.columns.except.length > 0) {
221
- columnsPart = ` (* EXCEPT (${params.columns.except.join(', ')}))`;
409
+ columnsPart = ` (* EXCEPT (${params.columns.except.join(", ")}))`;
222
410
  }
223
411
  }
224
412
  return `INSERT INTO ${params.table.trim()}${columnsPart} FORMAT ${format}`;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAYA,mCAA8C;AAC9C,qCAA6D;AAO7D,qCAAqE;AASrE,uCAKmB;AAuKnB,MAAa,gBAAgB;IACV,wBAAwB,CAAqB;IAC7C,gBAAgB,CAAmB;IACnC,UAAU,CAAqB;IAC/B,aAAa,CAAwB;IACrC,aAAa,CAAwB;IACrC,SAAS,CAAU;IACnB,IAAI,CAA0B;IAC9B,YAAY,CAAe;IAC3B,MAAM,CAAmB;IAE1C,YACE,MAAyE;QAEzE,MAAM,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,WAAW;YACrC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE;YAC9B,CAAC,CAAC,IAAI,sBAAa,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,IAAA,6BAAoB,EACxC,MAAM,EACN,MAAM,EACN,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,IAAI,CAC/C,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAA,4BAAmB,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAC3C,aAAa,EACb,IAAI,CAAC,gBAAgB,CACtB,CAAC;QACF,gEAAgE;QAChE,wEAAwE;QACxE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;QACjD,IAAI,CAAC,YAAY,GAAG;YAClB,GAAG,2BAAmB;YACtB,GAAG,MAAM,CAAC,IAAI;SACf,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnE,sEAAsE;QACtE,sDAAsD;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,8BAAoB,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,KAAK,CACT,MAAqC;QAErC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAChC,6BAAmB,CAAC,KAAK,EACzB;YACE,IAAI,EAAE,4BAAkB,CAAC,MAAM;YAC/B,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC;gBACtC,4BAA4B,EAAE,MAAM;gBACpC,6BAA6B,EAAE,WAAW,CAAC,QAAQ;gBACnD,+BAA+B,EAAE,WAAW,CAAC,UAAU;aACxD,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,WAAW,CAAC;YAChB,IAAI,CAAC;gBACH,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;oBACxC,KAAK;oBACL,GAAG,WAAW;iBACf,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAA,yBAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACX,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAC5D,WAAW,CAAC;YACd,gEAAgE;YAChE,IAAI,CAAC,aAAa,CAAC,EAAE,6BAA6B,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,yBAAyB,CAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACtD,mEAAmE;YACnE,gEAAgE;YAChE,kEAAkE;YAClE,qEAAqE;YACrE,oEAAoE;YACpE,qEAAqE;YACrE,kDAAkD;YAClD,IAAI,CAAC,GAAG,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAChC,6BAAmB,CAAC,YAAY,EAChC,EAAE,IAAI,EAAE,4BAAkB,CAAC,MAAM,EAAE,EACnC,CAAC,UAAU,EAAE,EAAE;gBACb,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,aAAa,CACvB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,CAAC,GAAG,EAAE,EAAE;wBACN,IAAI,SAAS,IAAI,2BAAkB,CAAC,KAAK,EAAE,CAAC;4BAC1C,UAAU,CAAC,KAAK,CAAC;gCACf,GAAG;gCACH,MAAM,EAAE,QAAQ;gCAChB,OAAO,EAAE,uCAAuC;gCAChD,IAAI,EAAE;oCACJ,UAAU,EAAE,WAAW,CAAC,UAAU;oCAClC,IAAI,EAAE,WAAW,CAAC,IAAI;oCACtB,QAAQ;iCACT;6BACF,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,EACD,gBAAgB,EAChB,IAAI,CAAC,YAAY,EACjB,UAAU,CACX,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAA,yBAAe,EAAC,UAAU,EAAE,GAAG,CAAC,CAAC;oBACjC,UAAU,CAAC,GAAG,EAAE,CAAC;oBACjB,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,kEAAkE;YACpE,CAAC,CACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,IAAI,KAAK,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAChC,6BAAmB,CAAC,OAAO,EAC3B;YACE,IAAI,EAAE,4BAAkB,CAAC,MAAM;YAC/B,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC;gBACtC,6BAA6B,EAAE,WAAW,CAAC,QAAQ;gBACnD,+BAA+B,EAAE,WAAW,CAAC,UAAU;aACxD,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBAC3C,KAAK;oBACL,qBAAqB;oBACrB,GAAG,WAAW;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,CAAC;oBACjB,6BAA6B,EAAE,MAAM,CAAC,QAAQ;iBAC/C,CAAC,CAAC;gBACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACxC,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAA,yBAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3B,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,CACR,MAAiD;QAEjD,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,0BAA0B,GAC9B,MAAM,CAAC,0BAA0B,IAAI,IAAI,CAAC;QAC5C,MAAM,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,IAAI,KAAK,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAChC,6BAAmB,CAAC,IAAI,EACxB;YACE,IAAI,EAAE,4BAAkB,CAAC,MAAM;YAC/B,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC;gBACtC,6BAA6B,EAAE,WAAW,CAAC,QAAQ;gBACnD,+BAA+B,EAAE,WAAW,CAAC,UAAU;aACxD,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBACxC,KAAK;oBACL,MAAM;oBACN,0BAA0B;oBAC1B,qBAAqB;oBACrB,GAAG,WAAW;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,CAAC;oBACjB,6BAA6B,EAAE,MAAM,CAAC,QAAQ;iBAC/C,CAAC,CAAC;gBACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACxC,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAA,yBAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3B,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,MAAM,CAAI,MAA+B;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC;QACrD,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE/D,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAChC,6BAAmB,CAAC,MAAM,EAC1B;YACE,IAAI,EAAE,4BAAkB,CAAC,MAAM;YAC/B,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC;gBACtC,mBAAmB,EAAE,QAAQ;gBAC7B,oBAAoB,EAAE,MAAM,CAAC,KAAK;gBAClC,2BAA2B,EAAE,MAAM;gBACnC,6BAA6B,EAAE,WAAW,CAAC,QAAQ;gBACnD,+BAA+B,EAAE,WAAW,CAAC,UAAU;gBACvD,4DAA4D;gBAC5D,0DAA0D;gBAC1D,8BAA8B,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;oBAC1D,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;oBACtB,CAAC,CAAC,SAAS;aACd,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACtE,uDAAuD;gBACvD,qDAAqD;gBACrD,2DAA2D;gBAC3D,kEAAkE;gBAClE,4DAA4D;gBAC5D,mEAAmE;gBACnE,kDAAkD;gBAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;oBAC1C,KAAK;oBACL,MAAM;oBACN,GAAG,WAAW;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,CAAC;oBACjB,6BAA6B,EAAE,MAAM,CAAC,QAAQ;iBAC/C,CAAC,CAAC;gBACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACxC,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAA,yBAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3B,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,MAAmB;QAC5B,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAChC,6BAAmB,CAAC,IAAI,EACxB;YACE,IAAI,EAAE,4BAAkB,CAAC,MAAM;YAC/B,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC;gBACtC,wBAAwB,EAAE,MAAM;aACjC,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAC/B,MAAM,IAAI,EAAE,MAAM,EAAE,KAAc,EAAE,CACrC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAA,yBAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3B,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,sBAAsB,CAC5B,KAA+B;QAE/B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QACtC,MAAM,KAAK,GAA6B;YACtC,gBAAgB,EAAE,YAAY;YAC9B,gBAAgB,EAAE,GAAG,CAAC,QAAQ;YAC9B,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC;YACjC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ;SAC/C,CAAC;QACF,IAAI,IAAI,CAAC,gBAAgB,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACvD,KAAK,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC;QACzE,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,SAAS;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,qBAAqB,CAAC,MAAuB;QACnD,OAAO;YACL,mBAAmB,EAAE;gBACnB,GAAG,IAAI,CAAC,wBAAwB;gBAChC,GAAG,MAAM,CAAC,mBAAmB;aAC9B;YACD,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS;YAC/C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;YACjD,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;SAC5D,CAAC;IACJ,CAAC;CACF;AAxYD,4CAwYC;AAED,SAAS,aAAa,CAAC,GAAQ;IAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED;;;iCAGiC;AACjC,SAAS,yBAAyB,CAChC,IAAoB,EACpB,MAAkD;IAElD,MAAM,UAAU,GAA6B,EAAE,CAAC;IAChD,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC1C,UAAU,CAAC,yBAAyB,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAClE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,UAAU,CAAC,8BAA8B,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;QAC/D,UAAU,CAAC,+BAA+B,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;QACjE,UAAU,CAAC,iCAAiC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;QACrE,UAAU,CAAC,kCAAkC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;QACvE,UAAU,CAAC,gCAAgC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QACnE,UAAU,CAAC,iCAAiC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;QACrE,UAAU,CAAC,+BAA+B,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,MAAkB;IACpD,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrB,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,KAAK,GAAG,YAAY,GAAG,MAAM,CAAC;AACvC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACzB,cAAc,GAAG,CAAC,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,cAAc,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAY;IACzC,OAAO,CACL,GAAG,KAAK,SAAS;QACjB,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,8CAA8C;QAC9C,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CACpD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,MAAuB,EACvB,MAAkB;IAElB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,WAAW,GAAG,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAClD,CAAC;aAAM,IACL,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAChC,CAAC;YACD,WAAW,GAAG,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,eAAe,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,WAAW,WAAW,MAAM,EAAE,CAAC;AAC7E,CAAC"}