@clickhouse/client 0.0.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 (105) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +636 -0
  3. package/dist/clickhouse_types.d.ts +17 -0
  4. package/dist/clickhouse_types.js +3 -0
  5. package/dist/clickhouse_types.js.map +1 -0
  6. package/dist/client.d.ts +56 -0
  7. package/dist/client.js +180 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/connection/adapter/base_http_adapter.d.ts +33 -0
  10. package/dist/connection/adapter/base_http_adapter.js +257 -0
  11. package/dist/connection/adapter/base_http_adapter.js.map +1 -0
  12. package/dist/connection/adapter/http_adapter.d.ts +10 -0
  13. package/dist/connection/adapter/http_adapter.js +27 -0
  14. package/dist/connection/adapter/http_adapter.js.map +1 -0
  15. package/dist/connection/adapter/http_search_params.d.ts +9 -0
  16. package/dist/connection/adapter/http_search_params.js +36 -0
  17. package/dist/connection/adapter/http_search_params.js.map +1 -0
  18. package/dist/connection/adapter/https_adapter.d.ts +10 -0
  19. package/dist/connection/adapter/https_adapter.js +27 -0
  20. package/dist/connection/adapter/https_adapter.js.map +1 -0
  21. package/dist/connection/adapter/index.d.ts +2 -0
  22. package/dist/connection/adapter/index.js +8 -0
  23. package/dist/connection/adapter/index.js.map +1 -0
  24. package/dist/connection/adapter/transform_url.d.ts +5 -0
  25. package/dist/connection/adapter/transform_url.js +15 -0
  26. package/dist/connection/adapter/transform_url.js.map +1 -0
  27. package/dist/connection/connection.d.ts +34 -0
  28. package/dist/connection/connection.js +17 -0
  29. package/dist/connection/connection.js.map +1 -0
  30. package/dist/connection/index.d.ts +1 -0
  31. package/dist/connection/index.js +18 -0
  32. package/dist/connection/index.js.map +1 -0
  33. package/dist/data_formatter/format_query_params.d.ts +1 -0
  34. package/dist/data_formatter/format_query_params.js +61 -0
  35. package/dist/data_formatter/format_query_params.js.map +1 -0
  36. package/dist/data_formatter/format_query_settings.d.ts +2 -0
  37. package/dist/data_formatter/format_query_settings.js +21 -0
  38. package/dist/data_formatter/format_query_settings.js.map +1 -0
  39. package/dist/data_formatter/formatter.d.ts +23 -0
  40. package/dist/data_formatter/formatter.js +81 -0
  41. package/dist/data_formatter/formatter.js.map +1 -0
  42. package/dist/data_formatter/index.d.ts +3 -0
  43. package/dist/data_formatter/index.js +23 -0
  44. package/dist/data_formatter/index.js.map +1 -0
  45. package/dist/error/index.d.ts +1 -0
  46. package/dist/error/index.js +18 -0
  47. package/dist/error/index.js.map +1 -0
  48. package/dist/error/parse_error.d.ts +12 -0
  49. package/dist/error/parse_error.js +39 -0
  50. package/dist/error/parse_error.js.map +1 -0
  51. package/dist/index.d.ts +15 -0
  52. package/dist/index.js +14 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/logger.d.ts +8 -0
  55. package/dist/logger.js +35 -0
  56. package/dist/logger.js.map +1 -0
  57. package/dist/rows.d.ts +50 -0
  58. package/dist/rows.js +114 -0
  59. package/dist/rows.js.map +1 -0
  60. package/dist/schema/common.d.ts +8 -0
  61. package/dist/schema/common.js +3 -0
  62. package/dist/schema/common.js.map +1 -0
  63. package/dist/schema/compact.d.ts +3 -0
  64. package/dist/schema/compact.js +24 -0
  65. package/dist/schema/compact.js.map +1 -0
  66. package/dist/schema/engines.d.ts +40 -0
  67. package/dist/schema/engines.js +61 -0
  68. package/dist/schema/engines.js.map +1 -0
  69. package/dist/schema/index.d.ts +7 -0
  70. package/dist/schema/index.js +24 -0
  71. package/dist/schema/index.js.map +1 -0
  72. package/dist/schema/query_formatter.d.ts +9 -0
  73. package/dist/schema/query_formatter.js +48 -0
  74. package/dist/schema/query_formatter.js.map +1 -0
  75. package/dist/schema/result.d.ts +13 -0
  76. package/dist/schema/result.js +3 -0
  77. package/dist/schema/result.js.map +1 -0
  78. package/dist/schema/schema.d.ts +6 -0
  79. package/dist/schema/schema.js +20 -0
  80. package/dist/schema/schema.js.map +1 -0
  81. package/dist/schema/stream.d.ts +11 -0
  82. package/dist/schema/stream.js +25 -0
  83. package/dist/schema/stream.js.map +1 -0
  84. package/dist/schema/table.d.ts +44 -0
  85. package/dist/schema/table.js +70 -0
  86. package/dist/schema/table.js.map +1 -0
  87. package/dist/schema/types.d.ts +201 -0
  88. package/dist/schema/types.js +268 -0
  89. package/dist/schema/types.js.map +1 -0
  90. package/dist/schema/where.d.ts +8 -0
  91. package/dist/schema/where.js +43 -0
  92. package/dist/schema/where.js.map +1 -0
  93. package/dist/settings.d.ts +1453 -0
  94. package/dist/settings.js +28 -0
  95. package/dist/settings.js.map +1 -0
  96. package/dist/utils/index.d.ts +2 -0
  97. package/dist/utils/index.js +19 -0
  98. package/dist/utils/index.js.map +1 -0
  99. package/dist/utils/stream.d.ts +5 -0
  100. package/dist/utils/stream.js +32 -0
  101. package/dist/utils/stream.js.map +1 -0
  102. package/dist/utils/string.d.ts +1 -0
  103. package/dist/utils/string.js +9 -0
  104. package/dist/utils/string.js.map +1 -0
  105. package/package.json +63 -0
@@ -0,0 +1,56 @@
1
+ /// <reference types="node" />
2
+ import Stream from 'stream';
3
+ import { Logger } from './logger';
4
+ import { type DataFormat } from './data_formatter';
5
+ import { Rows } from './rows';
6
+ import type { ClickHouseSettings } from './settings';
7
+ export interface ClickHouseClientConfigOptions {
8
+ host?: string;
9
+ connect_timeout?: number;
10
+ request_timeout?: number;
11
+ max_open_connections?: number;
12
+ compression?: {
13
+ response?: boolean;
14
+ request?: boolean;
15
+ };
16
+ username?: string;
17
+ password?: string;
18
+ application?: string;
19
+ database?: string;
20
+ clickhouse_settings?: ClickHouseSettings;
21
+ log?: {
22
+ enable?: boolean;
23
+ LoggerClass?: new (enabled: boolean) => Logger;
24
+ };
25
+ }
26
+ export interface BaseParams {
27
+ clickhouse_settings?: ClickHouseSettings;
28
+ query_params?: Record<string, unknown>;
29
+ abort_signal?: AbortSignal;
30
+ }
31
+ export interface QueryParams extends BaseParams {
32
+ query: string;
33
+ format?: DataFormat;
34
+ }
35
+ export interface ExecParams extends BaseParams {
36
+ query: string;
37
+ }
38
+ export interface InsertParams<T = unknown> extends BaseParams {
39
+ table: string;
40
+ values: ReadonlyArray<T> | Stream.Readable;
41
+ format?: DataFormat;
42
+ }
43
+ export declare class ClickHouseClient {
44
+ private readonly config;
45
+ private readonly connection;
46
+ readonly logger: Logger;
47
+ constructor(config?: ClickHouseClientConfigOptions);
48
+ private getBaseParams;
49
+ query(params: QueryParams): Promise<Rows>;
50
+ exec(params: ExecParams): Promise<Stream.Readable>;
51
+ insert<T>(params: InsertParams<T>): Promise<void>;
52
+ ping(): Promise<boolean>;
53
+ close(): Promise<void>;
54
+ }
55
+ export declare function validateInsertValues(values: ReadonlyArray<any> | Stream.Readable, format: DataFormat): void;
56
+ export declare function createClient(config?: ClickHouseClientConfigOptions): ClickHouseClient;
package/dist/client.js ADDED
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createClient = exports.validateInsertValues = exports.ClickHouseClient = void 0;
7
+ const stream_1 = __importDefault(require("stream"));
8
+ const connection_1 = require("./connection");
9
+ const logger_1 = require("./logger");
10
+ const utils_1 = require("./utils");
11
+ const data_formatter_1 = require("./data_formatter");
12
+ const rows_1 = require("./rows");
13
+ function validateConfig({ url }) {
14
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
15
+ throw new Error(`Only http(s) protocol is supported, but given: [${url.protocol}]`);
16
+ }
17
+ // TODO add SSL validation
18
+ }
19
+ function createUrl(host) {
20
+ try {
21
+ return new URL(host);
22
+ }
23
+ catch (err) {
24
+ throw new Error('Configuration parameter "host" contains malformed url.');
25
+ }
26
+ }
27
+ function normalizeConfig(config, loggingEnabled) {
28
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
29
+ return {
30
+ url: createUrl((_a = config.host) !== null && _a !== void 0 ? _a : 'http://localhost:8123'),
31
+ connect_timeout: (_b = config.connect_timeout) !== null && _b !== void 0 ? _b : 10000,
32
+ request_timeout: (_c = config.request_timeout) !== null && _c !== void 0 ? _c : 300000,
33
+ max_open_connections: (_d = config.max_open_connections) !== null && _d !== void 0 ? _d : Infinity,
34
+ // tls: _config.tls,
35
+ compression: {
36
+ decompress_response: (_f = (_e = config.compression) === null || _e === void 0 ? void 0 : _e.response) !== null && _f !== void 0 ? _f : true,
37
+ compress_request: (_h = (_g = config.compression) === null || _g === void 0 ? void 0 : _g.request) !== null && _h !== void 0 ? _h : false,
38
+ },
39
+ username: (_j = config.username) !== null && _j !== void 0 ? _j : 'default',
40
+ password: (_k = config.password) !== null && _k !== void 0 ? _k : '',
41
+ application: (_l = config.application) !== null && _l !== void 0 ? _l : 'clickhouse-js',
42
+ database: (_m = config.database) !== null && _m !== void 0 ? _m : 'default',
43
+ clickhouse_settings: (_o = config.clickhouse_settings) !== null && _o !== void 0 ? _o : {},
44
+ log: {
45
+ enable: loggingEnabled,
46
+ LoggerClass: (_q = (_p = config.log) === null || _p === void 0 ? void 0 : _p.LoggerClass) !== null && _q !== void 0 ? _q : logger_1.Logger,
47
+ },
48
+ };
49
+ }
50
+ class ClickHouseClient {
51
+ constructor(config = {}) {
52
+ var _a;
53
+ Object.defineProperty(this, "config", {
54
+ enumerable: true,
55
+ configurable: true,
56
+ writable: true,
57
+ value: void 0
58
+ });
59
+ Object.defineProperty(this, "connection", {
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true,
63
+ value: void 0
64
+ });
65
+ Object.defineProperty(this, "logger", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: void 0
70
+ });
71
+ const loggingEnabled = Boolean(((_a = config.log) === null || _a === void 0 ? void 0 : _a.enable) || process.env.CLICKHOUSE_LOG_ENABLE);
72
+ this.config = normalizeConfig(config, loggingEnabled);
73
+ validateConfig(this.config);
74
+ this.logger = new this.config.log.LoggerClass(this.config.log.enable);
75
+ this.connection = (0, connection_1.createConnection)(this.config, this.logger);
76
+ }
77
+ getBaseParams(params) {
78
+ return {
79
+ clickhouse_settings: {
80
+ ...this.config.clickhouse_settings,
81
+ ...params.clickhouse_settings,
82
+ },
83
+ query_params: params.query_params,
84
+ abort_signal: params.abort_signal,
85
+ };
86
+ }
87
+ async query(params) {
88
+ var _a;
89
+ const format = (_a = params.format) !== null && _a !== void 0 ? _a : 'JSON';
90
+ const query = formatQuery(params.query, format);
91
+ const stream = await this.connection.select({
92
+ query,
93
+ ...this.getBaseParams(params),
94
+ });
95
+ return new rows_1.Rows(stream, format);
96
+ }
97
+ exec(params) {
98
+ const query = removeSemi(params.query.trim());
99
+ return this.connection.command({
100
+ query,
101
+ ...this.getBaseParams(params),
102
+ });
103
+ }
104
+ async insert(params) {
105
+ const format = params.format || 'JSONCompactEachRow';
106
+ validateInsertValues(params.values, format);
107
+ const query = `INSERT into ${params.table.trim()} FORMAT ${format}`;
108
+ await this.connection.insert({
109
+ query,
110
+ values: encodeValues(params.values, format),
111
+ ...this.getBaseParams(params),
112
+ });
113
+ }
114
+ async ping() {
115
+ return await this.connection.ping();
116
+ }
117
+ async close() {
118
+ return await this.connection.close();
119
+ }
120
+ }
121
+ exports.ClickHouseClient = ClickHouseClient;
122
+ function formatQuery(query, format) {
123
+ query = query.trim();
124
+ query = removeSemi(query);
125
+ return query + ' \nFORMAT ' + format;
126
+ }
127
+ function removeSemi(query) {
128
+ const idx = query.indexOf(';');
129
+ if (idx !== -1) {
130
+ return query.slice(0, idx);
131
+ }
132
+ return query;
133
+ }
134
+ function validateInsertValues(values, format) {
135
+ if (Array.isArray(values) === false && (0, utils_1.isStream)(values) === false) {
136
+ throw new Error('Insert expected "values" to be an array or a stream of values.');
137
+ }
138
+ if ((0, utils_1.isStream)(values)) {
139
+ if ((0, data_formatter_1.isSupportedRawFormat)(format)) {
140
+ if (values.readableObjectMode) {
141
+ throw new Error(`Insert for ${format} expected Readable Stream with disabled object mode.`);
142
+ }
143
+ }
144
+ else if (!values.readableObjectMode) {
145
+ throw new Error(`Insert for ${format} expected Readable Stream with enabled object mode.`);
146
+ }
147
+ }
148
+ }
149
+ exports.validateInsertValues = validateInsertValues;
150
+ /**
151
+ * A function encodes an array or a stream of JSON objects to a format compatible with ClickHouse.
152
+ * If values are provided as an array of JSON objects, the function encodes it in place.
153
+ * If values are provided as a stream of JSON objects, the function sets up the encoding of each chunk.
154
+ * If values are provided as a raw non-object stream, the function does nothing.
155
+ *
156
+ * @param values a set of values to send to ClickHouse.
157
+ * @param format a format to encode value to.
158
+ */
159
+ function encodeValues(values, format) {
160
+ if ((0, utils_1.isStream)(values)) {
161
+ // TSV/CSV/CustomSeparated formats don't require additional serialization
162
+ if (!values.readableObjectMode) {
163
+ return values;
164
+ }
165
+ // JSON* formats streams
166
+ return stream_1.default.pipeline(values, (0, utils_1.mapStream)((value) => (0, data_formatter_1.encodeJSON)(value, format)), pipelineCb);
167
+ }
168
+ // JSON* arrays
169
+ return values.map((value) => (0, data_formatter_1.encodeJSON)(value, format)).join('');
170
+ }
171
+ function createClient(config) {
172
+ return new ClickHouseClient(config);
173
+ }
174
+ exports.createClient = createClient;
175
+ function pipelineCb(err) {
176
+ if (err) {
177
+ console.error(err);
178
+ }
179
+ }
180
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAC3B,6CAAgE;AAChE,qCAAiC;AACjC,mCAA6C;AAC7C,qDAIyB;AACzB,iCAA6B;AAgD7B,SAAS,cAAc,CAAC,EAAE,GAAG,EAAoB;IAC/C,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;QACzD,MAAM,IAAI,KAAK,CACb,mDAAmD,GAAG,CAAC,QAAQ,GAAG,CACnE,CAAA;KACF;IACD,0BAA0B;AAC5B,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI;QACF,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;KACrB;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;KAC1E;AACH,CAAC;AAED,SAAS,eAAe,CACtB,MAAqC,EACrC,cAAuB;;IAEvB,OAAO;QACL,GAAG,EAAE,SAAS,CAAC,MAAA,MAAM,CAAC,IAAI,mCAAI,uBAAuB,CAAC;QACtD,eAAe,EAAE,MAAA,MAAM,CAAC,eAAe,mCAAI,KAAM;QACjD,eAAe,EAAE,MAAA,MAAM,CAAC,eAAe,mCAAI,MAAO;QAClD,oBAAoB,EAAE,MAAA,MAAM,CAAC,oBAAoB,mCAAI,QAAQ;QAC7D,oBAAoB;QACpB,WAAW,EAAE;YACX,mBAAmB,EAAE,MAAA,MAAA,MAAM,CAAC,WAAW,0CAAE,QAAQ,mCAAI,IAAI;YACzD,gBAAgB,EAAE,MAAA,MAAA,MAAM,CAAC,WAAW,0CAAE,OAAO,mCAAI,KAAK;SACvD;QACD,QAAQ,EAAE,MAAA,MAAM,CAAC,QAAQ,mCAAI,SAAS;QACtC,QAAQ,EAAE,MAAA,MAAM,CAAC,QAAQ,mCAAI,EAAE;QAC/B,WAAW,EAAE,MAAA,MAAM,CAAC,WAAW,mCAAI,eAAe;QAClD,QAAQ,EAAE,MAAA,MAAM,CAAC,QAAQ,mCAAI,SAAS;QACtC,mBAAmB,EAAE,MAAA,MAAM,CAAC,mBAAmB,mCAAI,EAAE;QACrD,GAAG,EAAE;YACH,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,MAAA,MAAA,MAAM,CAAC,GAAG,0CAAE,WAAW,mCAAI,eAAM;SAC/C;KACF,CAAA;AACH,CAAC;AAID,MAAa,gBAAgB;IAK3B,YAAY,SAAwC,EAAE;;QAJtD;;;;;WAAyC;QACzC;;;;;WAAuC;QACvC;;;;;WAAuB;QAGrB,MAAM,cAAc,GAAG,OAAO,CAC5B,CAAA,MAAA,MAAM,CAAC,GAAG,0CAAE,MAAM,KAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CACxD,CAAA;QACD,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QACrD,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE3B,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACrE,IAAI,CAAC,UAAU,GAAG,IAAA,6BAAgB,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC9D,CAAC;IAEO,aAAa,CAAC,MAAkB;QACtC,OAAO;YACL,mBAAmB,EAAE;gBACnB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB;gBAClC,GAAG,MAAM,CAAC,mBAAmB;aAC9B;YACD,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAmB;;QAC7B,MAAM,MAAM,GAAG,MAAA,MAAM,CAAC,MAAM,mCAAI,MAAM,CAAA;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAC1C,KAAK;YACL,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SAC9B,CAAC,CAAA;QACF,OAAO,IAAI,WAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,CAAC,MAAkB;QACrB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7B,KAAK;YACL,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SAC9B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,MAAuB;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAA;QAEpD,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,eAAe,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,MAAM,EAAE,CAAA;QAEnE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAC3B,KAAK;YACL,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;YAC3C,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SAC9B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IACtC,CAAC;CACF;AAjED,4CAiEC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,MAAkB;IACpD,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IACpB,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IACzB,OAAO,KAAK,GAAG,YAAY,GAAG,MAAM,CAAA;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;QACd,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;KAC3B;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,oBAAoB,CAClC,MAA4C,EAC5C,MAAkB;IAElB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,KAAK,KAAK,EAAE;QACjE,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAA;KACF;IAED,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE;QACpB,IAAI,IAAA,qCAAoB,EAAC,MAAM,CAAC,EAAE;YAChC,IAAI,MAAM,CAAC,kBAAkB,EAAE;gBAC7B,MAAM,IAAI,KAAK,CACb,cAAc,MAAM,sDAAsD,CAC3E,CAAA;aACF;SACF;aAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;YACrC,MAAM,IAAI,KAAK,CACb,cAAc,MAAM,qDAAqD,CAC1E,CAAA;SACF;KACF;AACH,CAAC;AAvBD,oDAuBC;AAED;;;;;;;;GAQG;AACH,SAAS,YAAY,CACnB,MAA4C,EAC5C,MAAkB;IAElB,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE;QACpB,yEAAyE;QACzE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;YAC9B,OAAO,MAAM,CAAA;SACd;QACD,wBAAwB;QACxB,OAAO,gBAAM,CAAC,QAAQ,CACpB,MAAM,EACN,IAAA,iBAAS,EAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,2BAAU,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAC/C,UAAU,CACX,CAAA;KACF;IACD,eAAe;IACf,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,2BAAU,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAClE,CAAC;AAED,SAAgB,YAAY,CAC1B,MAAsC;IAEtC,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;AACrC,CAAC;AAJD,oCAIC;AAED,SAAS,UAAU,CAAC,GAAiC;IACnD,IAAI,GAAG,EAAE;QACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KACnB;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import Stream from 'stream';
4
+ import type Http from 'http';
5
+ import type { Logger } from '../../logger';
6
+ import type { BaseParams, Connection, ConnectionParams, InsertParams } from '../connection';
7
+ export interface RequestParams {
8
+ method: 'GET' | 'POST';
9
+ url: URL;
10
+ body?: string | Stream.Readable;
11
+ abort_signal?: AbortSignal;
12
+ decompress_response?: boolean;
13
+ compress_request?: boolean;
14
+ }
15
+ export declare abstract class BaseHttpAdapter implements Connection {
16
+ private readonly config;
17
+ private readonly logger;
18
+ protected readonly agent: Http.Agent;
19
+ protected readonly headers: Http.OutgoingHttpHeaders;
20
+ protected constructor(config: ConnectionParams, logger: Logger, agent: Http.Agent);
21
+ protected abstract createClientRequest(url: URL, params: RequestParams): Http.ClientRequest;
22
+ protected request(params: RequestParams): Promise<Stream.Readable>;
23
+ ping(): Promise<boolean>;
24
+ select(params: BaseParams): Promise<Stream.Readable>;
25
+ command(params: BaseParams): Promise<Stream.Readable>;
26
+ insert(params: InsertParams): Promise<void>;
27
+ close(): Promise<void>;
28
+ private logResponse;
29
+ protected getHeaders(params: RequestParams): {
30
+ 'Content-Encoding'?: string | undefined;
31
+ 'Accept-Encoding'?: string | undefined;
32
+ };
33
+ }
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BaseHttpAdapter = void 0;
7
+ const stream_1 = __importDefault(require("stream"));
8
+ const zlib_1 = __importDefault(require("zlib"));
9
+ const error_1 = require("../../error");
10
+ const http_search_params_1 = require("./http_search_params");
11
+ const transform_url_1 = require("./transform_url");
12
+ const utils_1 = require("../../utils");
13
+ function isSuccessfulResponse(statusCode) {
14
+ return Boolean(statusCode && 200 <= statusCode && statusCode < 300);
15
+ }
16
+ function isEventTarget(signal) {
17
+ return 'removeEventListener' in signal;
18
+ }
19
+ function withHttpSettings(clickhouse_settings, compression) {
20
+ return {
21
+ ...(compression
22
+ ? {
23
+ enable_http_compression: 1,
24
+ }
25
+ : {}),
26
+ ...clickhouse_settings,
27
+ };
28
+ }
29
+ function buildDefaultHeaders(username, password) {
30
+ return {
31
+ Authorization: `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`,
32
+ };
33
+ }
34
+ function decompressResponse(response) {
35
+ const encoding = response.headers['content-encoding'];
36
+ if (encoding === 'gzip') {
37
+ return {
38
+ response: stream_1.default.pipeline(response, zlib_1.default.createGunzip(), function pipelineCb(err) {
39
+ if (err) {
40
+ console.error(err);
41
+ }
42
+ }),
43
+ };
44
+ }
45
+ else if (encoding !== undefined) {
46
+ return {
47
+ error: new Error(`Unexpected encoding: ${encoding}`),
48
+ };
49
+ }
50
+ return { response };
51
+ }
52
+ function isDecompressionError(result) {
53
+ return result.error !== undefined;
54
+ }
55
+ class BaseHttpAdapter {
56
+ constructor(config, logger, agent) {
57
+ Object.defineProperty(this, "config", {
58
+ enumerable: true,
59
+ configurable: true,
60
+ writable: true,
61
+ value: config
62
+ });
63
+ Object.defineProperty(this, "logger", {
64
+ enumerable: true,
65
+ configurable: true,
66
+ writable: true,
67
+ value: logger
68
+ });
69
+ Object.defineProperty(this, "agent", {
70
+ enumerable: true,
71
+ configurable: true,
72
+ writable: true,
73
+ value: agent
74
+ });
75
+ Object.defineProperty(this, "headers", {
76
+ enumerable: true,
77
+ configurable: true,
78
+ writable: true,
79
+ value: void 0
80
+ });
81
+ this.headers = buildDefaultHeaders(config.username, config.password);
82
+ }
83
+ async request(params) {
84
+ return new Promise((resolve, reject) => {
85
+ const start = Date.now();
86
+ const request = this.createClientRequest(params.url, params);
87
+ function onError(err) {
88
+ removeRequestListeners();
89
+ reject(err);
90
+ }
91
+ const onResponse = async (_response) => {
92
+ this.logResponse(params, _response, start);
93
+ const decompressionResult = decompressResponse(_response);
94
+ if (isDecompressionError(decompressionResult)) {
95
+ return reject(decompressionResult.error);
96
+ }
97
+ if (isSuccessfulResponse(_response.statusCode)) {
98
+ return resolve(decompressionResult.response);
99
+ }
100
+ else {
101
+ reject((0, error_1.parseError)(await (0, utils_1.getAsText)(decompressionResult.response)));
102
+ }
103
+ };
104
+ function onTimeout() {
105
+ removeRequestListeners();
106
+ request.once('error', function () {
107
+ /**
108
+ * catch "Error: ECONNRESET" error which shouldn't be reported to users.
109
+ * see the full sequence of events https://nodejs.org/api/http.html#httprequesturl-options-callback
110
+ * */
111
+ });
112
+ request.destroy();
113
+ reject(new Error('Timeout error'));
114
+ }
115
+ function onAbortSignal() {
116
+ // instead of deprecated request.abort()
117
+ request.destroy(new Error('The request was aborted.'));
118
+ }
119
+ function onAbort() {
120
+ // Prefer 'abort' event since it always triggered unlike 'error' and 'close'
121
+ // * see the full sequence of events https://nodejs.org/api/http.html#httprequesturl-options-callback
122
+ removeRequestListeners();
123
+ request.once('error', function () {
124
+ /**
125
+ * catch "Error: ECONNRESET" error which shouldn't be reported to users.
126
+ * see the full sequence of events https://nodejs.org/api/http.html#httprequesturl-options-callback
127
+ * */
128
+ });
129
+ reject(new Error('The request was aborted.'));
130
+ }
131
+ function onClose() {
132
+ // Adapter uses 'close' event to clean up listeners after the successful response.
133
+ // It's necessary in order to handle 'abort' and 'timeout' events while response is streamed.
134
+ // setImmediate is a workaround. If a request cancelled before sent, the 'abort' happens after 'close'.
135
+ // Which contradicts the docs https://nodejs.org/docs/latest-v14.x/api/http.html#http_http_request_url_options_callback
136
+ setImmediate(removeRequestListeners);
137
+ }
138
+ function removeRequestListeners() {
139
+ request.removeListener('response', onResponse);
140
+ request.removeListener('error', onError);
141
+ request.removeListener('timeout', onTimeout);
142
+ request.removeListener('abort', onAbort);
143
+ request.removeListener('close', onClose);
144
+ if (params.abort_signal !== undefined) {
145
+ if (isEventTarget(params.abort_signal)) {
146
+ params.abort_signal.removeEventListener('abort', onAbortSignal);
147
+ }
148
+ else {
149
+ // @ts-expect-error if it's EventEmitter
150
+ params.abort_signal.removeListener('abort', onAbortSignal);
151
+ }
152
+ }
153
+ }
154
+ if (params.abort_signal) {
155
+ // We should use signal API when nodejs v14 is not supported anymore.
156
+ // However, it seems that Http.request doesn't abort after 'response' event.
157
+ // Requires an additional investigation
158
+ // https://nodejs.org/api/globals.html#class-abortsignal
159
+ params.abort_signal.addEventListener('abort', onAbortSignal, {
160
+ once: true,
161
+ });
162
+ }
163
+ request.on('response', onResponse);
164
+ request.on('timeout', onTimeout);
165
+ request.on('error', onError);
166
+ request.on('abort', onAbort);
167
+ request.on('close', onClose);
168
+ if (!params.body)
169
+ return request.end();
170
+ const bodyStream = (0, utils_1.isStream)(params.body)
171
+ ? params.body
172
+ : stream_1.default.Readable.from([params.body]);
173
+ const callback = (err) => {
174
+ if (err) {
175
+ removeRequestListeners();
176
+ reject(err);
177
+ }
178
+ };
179
+ if (params.compress_request) {
180
+ stream_1.default.pipeline(bodyStream, zlib_1.default.createGzip(), request, callback);
181
+ }
182
+ else {
183
+ stream_1.default.pipeline(bodyStream, request, callback);
184
+ }
185
+ });
186
+ }
187
+ async ping() {
188
+ // TODO add status code check
189
+ const response = await this.request({
190
+ method: 'GET',
191
+ url: (0, transform_url_1.transformUrl)({ url: this.config.url, pathname: '/ping' }),
192
+ });
193
+ response.destroy();
194
+ return true;
195
+ }
196
+ async select(params) {
197
+ const clickhouse_settings = withHttpSettings(params.clickhouse_settings, this.config.compression.decompress_response);
198
+ const searchParams = (0, http_search_params_1.toSearchParams)({
199
+ database: this.config.database,
200
+ clickhouse_settings,
201
+ query_params: params.query_params,
202
+ });
203
+ return await this.request({
204
+ method: 'POST',
205
+ url: (0, transform_url_1.transformUrl)({ url: this.config.url, pathname: '/', searchParams }),
206
+ body: params.query,
207
+ abort_signal: params.abort_signal,
208
+ decompress_response: clickhouse_settings.enable_http_compression === 1,
209
+ });
210
+ }
211
+ async command(params) {
212
+ const searchParams = (0, http_search_params_1.toSearchParams)({
213
+ database: this.config.database,
214
+ clickhouse_settings: params.clickhouse_settings,
215
+ query_params: params.query_params,
216
+ });
217
+ return await this.request({
218
+ method: 'POST',
219
+ url: (0, transform_url_1.transformUrl)({ url: this.config.url, pathname: '/', searchParams }),
220
+ body: params.query,
221
+ abort_signal: params.abort_signal,
222
+ });
223
+ }
224
+ async insert(params) {
225
+ const searchParams = (0, http_search_params_1.toSearchParams)({
226
+ database: this.config.database,
227
+ clickhouse_settings: params.clickhouse_settings,
228
+ query_params: params.query_params,
229
+ query: params.query,
230
+ });
231
+ await this.request({
232
+ method: 'POST',
233
+ url: (0, transform_url_1.transformUrl)({ url: this.config.url, pathname: '/', searchParams }),
234
+ body: params.values,
235
+ abort_signal: params.abort_signal,
236
+ compress_request: this.config.compression.compress_request,
237
+ });
238
+ }
239
+ async close() {
240
+ if (this.agent !== undefined && this.agent.destroy !== undefined) {
241
+ this.agent.destroy();
242
+ }
243
+ }
244
+ logResponse(params, response, startTimestamp) {
245
+ const duration = Date.now() - startTimestamp;
246
+ this.logger.debug(`[http adapter] response: ${params.method} ${params.url.pathname}${params.url.search ? ` ${params.url.search}` : ''} ${response.statusCode} ${duration}ms`);
247
+ }
248
+ getHeaders(params) {
249
+ return {
250
+ ...this.headers,
251
+ ...(params.decompress_response ? { 'Accept-Encoding': 'gzip' } : {}),
252
+ ...(params.compress_request ? { 'Content-Encoding': 'gzip' } : {}),
253
+ };
254
+ }
255
+ }
256
+ exports.BaseHttpAdapter = BaseHttpAdapter;
257
+ //# sourceMappingURL=base_http_adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base_http_adapter.js","sourceRoot":"","sources":["../../../src/connection/adapter/base_http_adapter.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAE3B,gDAAuB;AACvB,uCAAwC;AAUxC,6DAAqD;AACrD,mDAA8C;AAC9C,uCAAiD;AAYjD,SAAS,oBAAoB,CAAC,UAAmB;IAC/C,OAAO,OAAO,CAAC,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,UAAU,GAAG,GAAG,CAAC,CAAA;AACrE,CAAC;AAED,SAAS,aAAa,CAAC,MAAW;IAChC,OAAO,qBAAqB,IAAI,MAAM,CAAA;AACxC,CAAC;AAED,SAAS,gBAAgB,CACvB,mBAAwC,EACxC,WAAqB;IAErB,OAAO;QACL,GAAG,CAAC,WAAW;YACb,CAAC,CAAC;gBACE,uBAAuB,EAAE,CAAC;aAC3B;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,mBAAmB;KACvB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,QAAgB;IAEhB,OAAO;QACL,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC,QAAQ,CACrE,QAAQ,CACT,EAAE;KACJ,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAA8B;IAKxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAErD,IAAI,QAAQ,KAAK,MAAM,EAAE;QACvB,OAAO;YACL,QAAQ,EAAE,gBAAM,CAAC,QAAQ,CACvB,QAAQ,EACR,cAAI,CAAC,YAAY,EAAE,EACnB,SAAS,UAAU,CAAC,GAAG;gBACrB,IAAI,GAAG,EAAE;oBACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;iBACnB;YACH,CAAC,CACF;SACF,CAAA;KACF;SAAM,IAAI,QAAQ,KAAK,SAAS,EAAE;QACjC,OAAO;YACL,KAAK,EAAE,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC;SACrD,CAAA;KACF;IAED,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAW;IACvC,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,CAAA;AACnC,CAAC;AAED,MAAsB,eAAe;IAEnC,YACmB,MAAwB,EACxB,MAAc,EACZ,KAAiB;;;;;mBAFnB;;;;;;mBACA;;;;;;mBACE;;QAJrB;;;;;WAAoD;QAMlD,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACtE,CAAC;IAOS,KAAK,CAAC,OAAO,CAAC,MAAqB;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAExB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAE5D,SAAS,OAAO,CAAC,GAAU;gBACzB,sBAAsB,EAAE,CAAA;gBACxB,MAAM,CAAC,GAAG,CAAC,CAAA;YACb,CAAC;YAED,MAAM,UAAU,GAAG,KAAK,EACtB,SAA+B,EAChB,EAAE;gBACjB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;gBAE1C,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;gBAEzD,IAAI,oBAAoB,CAAC,mBAAmB,CAAC,EAAE;oBAC7C,OAAO,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;iBACzC;gBAED,IAAI,oBAAoB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;oBAC9C,OAAO,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;iBAC7C;qBAAM;oBACL,MAAM,CAAC,IAAA,kBAAU,EAAC,MAAM,IAAA,iBAAS,EAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;iBAClE;YACH,CAAC,CAAA;YAED,SAAS,SAAS;gBAChB,sBAAsB,EAAE,CAAA;gBACxB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE;oBACpB;;;yBAGK;gBACP,CAAC,CAAC,CAAA;gBACF,OAAO,CAAC,OAAO,EAAE,CAAA;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;YACpC,CAAC;YAED,SAAS,aAAa;gBACpB,wCAAwC;gBACxC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAA;YACxD,CAAC;YAED,SAAS,OAAO;gBACd,4EAA4E;gBAC5E,qGAAqG;gBACrG,sBAAsB,EAAE,CAAA;gBACxB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE;oBACpB;;;yBAGK;gBACP,CAAC,CAAC,CAAA;gBACF,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAA;YAC/C,CAAC;YAED,SAAS,OAAO;gBACd,kFAAkF;gBAClF,6FAA6F;gBAC7F,uGAAuG;gBACvG,uHAAuH;gBACvH,YAAY,CAAC,sBAAsB,CAAC,CAAA;YACtC,CAAC;YAED,SAAS,sBAAsB;gBAC7B,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;gBAC9C,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACxC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBAC5C,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACxC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACxC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE;oBACrC,IAAI,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;wBACtC,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;qBAChE;yBAAM;wBACL,wCAAwC;wBACxC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;qBAC3D;iBACF;YACH,CAAC;YAED,IAAI,MAAM,CAAC,YAAY,EAAE;gBACvB,qEAAqE;gBACrE,4EAA4E;gBAC5E,uCAAuC;gBACvC,wDAAwD;gBACxD,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE;oBAC3D,IAAI,EAAE,IAAI;iBACX,CAAC,CAAA;aACH;YAED,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YAClC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAChC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAE5B,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAA;YAEtC,MAAM,UAAU,GAAG,IAAA,gBAAQ,EAAC,MAAM,CAAC,IAAI,CAAC;gBACtC,CAAC,CAAC,MAAM,CAAC,IAAI;gBACb,CAAC,CAAC,gBAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;YAEvC,MAAM,QAAQ,GAAG,CAAC,GAAiC,EAAQ,EAAE;gBAC3D,IAAI,GAAG,EAAE;oBACP,sBAAsB,EAAE,CAAA;oBACxB,MAAM,CAAC,GAAG,CAAC,CAAA;iBACZ;YACH,CAAC,CAAA;YAED,IAAI,MAAM,CAAC,gBAAgB,EAAE;gBAC3B,gBAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;aAClE;iBAAM;gBACL,gBAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;aAC/C;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAClC,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,IAAA,4BAAY,EAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;SAC/D,CAAC,CAAA;QACF,QAAQ,CAAC,OAAO,EAAE,CAAA;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAkB;QAC7B,MAAM,mBAAmB,GAAG,gBAAgB,CAC1C,MAAM,CAAC,mBAAmB,EAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAC5C,CAAA;QACD,MAAM,YAAY,GAAG,IAAA,mCAAc,EAAC;YAClC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,mBAAmB;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAA;QAEF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,IAAA,4BAAY,EAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;YACxE,IAAI,EAAE,MAAM,CAAC,KAAK;YAClB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,mBAAmB,EAAE,mBAAmB,CAAC,uBAAuB,KAAK,CAAC;SACvE,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAkB;QAC9B,MAAM,YAAY,GAAG,IAAA,mCAAc,EAAC;YAClC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAA;QAEF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,IAAA,4BAAY,EAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;YACxE,IAAI,EAAE,MAAM,CAAC,KAAK;YAClB,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,MAAM,YAAY,GAAG,IAAA,mCAAc,EAAC;YAClC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAA;QAEF,MAAM,IAAI,CAAC,OAAO,CAAC;YACjB,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,IAAA,4BAAY,EAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;YACxE,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB;SAC3D,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE;YAChE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;SACrB;IACH,CAAC;IAEO,WAAW,CACjB,MAAqB,EACrB,QAA8B,EAC9B,cAAsB;QAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAA;QAE5C,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,4BAA4B,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,GAC9D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAChD,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,IAAI,CACxC,CAAA;IACH,CAAC;IAES,UAAU,CAAC,MAAqB;QACxC,OAAO;YACL,GAAG,IAAI,CAAC,OAAO;YACf,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAA;IACH,CAAC;CACF;AAhOD,0CAgOC"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ import Http from 'http';
3
+ import type { Logger } from '../../logger';
4
+ import type { Connection, ConnectionParams } from '../connection';
5
+ import type { RequestParams } from './base_http_adapter';
6
+ import { BaseHttpAdapter } from './base_http_adapter';
7
+ export declare class HttpAdapter extends BaseHttpAdapter implements Connection {
8
+ constructor(config: ConnectionParams, logger: Logger);
9
+ protected createClientRequest(url: URL, params: RequestParams): Http.ClientRequest;
10
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HttpAdapter = void 0;
7
+ const http_1 = __importDefault(require("http"));
8
+ const base_http_adapter_1 = require("./base_http_adapter");
9
+ class HttpAdapter extends base_http_adapter_1.BaseHttpAdapter {
10
+ constructor(config, logger) {
11
+ const agent = new http_1.default.Agent({
12
+ keepAlive: true,
13
+ timeout: config.request_timeout,
14
+ maxSockets: config.max_open_connections,
15
+ });
16
+ super(config, logger, agent);
17
+ }
18
+ createClientRequest(url, params) {
19
+ return http_1.default.request(params.url, {
20
+ method: params.method,
21
+ agent: this.agent,
22
+ headers: this.getHeaders(params),
23
+ });
24
+ }
25
+ }
26
+ exports.HttpAdapter = HttpAdapter;
27
+ //# sourceMappingURL=http_adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http_adapter.js","sourceRoot":"","sources":["../../../src/connection/adapter/http_adapter.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAKvB,2DAAqD;AAErD,MAAa,WAAY,SAAQ,mCAAe;IAC9C,YAAY,MAAwB,EAAE,MAAc;QAClD,MAAM,KAAK,GAAG,IAAI,cAAI,CAAC,KAAK,CAAC;YAC3B,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,MAAM,CAAC,eAAe;YAC/B,UAAU,EAAE,MAAM,CAAC,oBAAoB;SACxC,CAAC,CAAA;QACF,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;IAES,mBAAmB,CAC3B,GAAQ,EACR,MAAqB;QAErB,OAAO,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;SACjC,CAAC,CAAA;IACJ,CAAC;CACF;AApBD,kCAoBC"}
@@ -0,0 +1,9 @@
1
+ import type { ClickHouseSettings } from '../../settings';
2
+ declare type ToSearchParamsOptions = {
3
+ database: string;
4
+ clickhouse_settings?: ClickHouseSettings;
5
+ query_params?: Record<string, unknown>;
6
+ query?: string;
7
+ };
8
+ export declare function toSearchParams({ database, query, query_params, clickhouse_settings, }: ToSearchParamsOptions): URLSearchParams | undefined;
9
+ export {};
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toSearchParams = void 0;
4
+ const data_formatter_1 = require("../../data_formatter/");
5
+ // TODO validate max length of the resulting query
6
+ // https://stackoverflow.com/questions/812925/what-is-the-maximum-possible-length-of-a-query-string
7
+ function toSearchParams({ database, query, query_params, clickhouse_settings, }) {
8
+ if (clickhouse_settings === undefined &&
9
+ query_params === undefined &&
10
+ query === undefined &&
11
+ database === 'default') {
12
+ return;
13
+ }
14
+ const params = new URLSearchParams();
15
+ if (query_params !== undefined) {
16
+ for (const [key, value] of Object.entries(query_params)) {
17
+ params.set(`param_${key}`, (0, data_formatter_1.formatQueryParams)(value));
18
+ }
19
+ }
20
+ if (clickhouse_settings !== undefined) {
21
+ for (const [key, value] of Object.entries(clickhouse_settings)) {
22
+ if (value !== undefined) {
23
+ params.set(key, (0, data_formatter_1.formatQuerySettings)(value));
24
+ }
25
+ }
26
+ }
27
+ if (database !== 'default') {
28
+ params.set('database', database);
29
+ }
30
+ if (query) {
31
+ params.set('query', query);
32
+ }
33
+ return params;
34
+ }
35
+ exports.toSearchParams = toSearchParams;
36
+ //# sourceMappingURL=http_search_params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http_search_params.js","sourceRoot":"","sources":["../../../src/connection/adapter/http_search_params.ts"],"names":[],"mappings":";;;AAAA,0DAA8E;AAU9E,kDAAkD;AAClD,mGAAmG;AACnG,SAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,mBAAmB,GACG;IACtB,IACE,mBAAmB,KAAK,SAAS;QACjC,YAAY,KAAK,SAAS;QAC1B,KAAK,KAAK,SAAS;QACnB,QAAQ,KAAK,SAAS,EACtB;QACA,OAAM;KACP;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;IAEpC,IAAI,YAAY,KAAK,SAAS,EAAE;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YACvD,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,EAAE,IAAA,kCAAiB,EAAC,KAAK,CAAC,CAAC,CAAA;SACrD;KACF;IAED,IAAI,mBAAmB,KAAK,SAAS,EAAE;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;YAC9D,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAA,oCAAmB,EAAC,KAAK,CAAC,CAAC,CAAA;aAC5C;SACF;KACF;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE;QAC1B,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;KACjC;IAED,IAAI,KAAK,EAAE;QACT,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;KAC3B;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAxCD,wCAwCC"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ import type { RequestParams } from './base_http_adapter';
3
+ import { BaseHttpAdapter } from './base_http_adapter';
4
+ import type { Connection, ConnectionParams } from '../connection';
5
+ import type { Logger } from '../../logger';
6
+ import type Http from 'http';
7
+ export declare class HttpsAdapter extends BaseHttpAdapter implements Connection {
8
+ constructor(config: ConnectionParams, logger: Logger);
9
+ protected createClientRequest(url: URL, params: RequestParams): Http.ClientRequest;
10
+ }