@ultipa-graph/ultipa-driver 5.1.5-s5.2 → 6.0.4

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 (260) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/client.d.ts +196 -0
  4. package/dist/client.js +394 -0
  5. package/dist/config.d.ts +65 -0
  6. package/dist/config.js +135 -0
  7. package/dist/connection.d.ts +30 -0
  8. package/dist/connection.js +190 -0
  9. package/dist/errors.d.ts +99 -0
  10. package/dist/errors.js +237 -0
  11. package/dist/index.d.ts +14 -5
  12. package/dist/index.js +88 -39
  13. package/dist/printers.d.ts +33 -0
  14. package/dist/printers.js +312 -0
  15. package/dist/proto/gqldb.proto +689 -0
  16. package/dist/response.d.ts +256 -0
  17. package/dist/response.js +723 -0
  18. package/dist/services/admin-service.d.ts +44 -0
  19. package/dist/services/admin-service.js +168 -0
  20. package/dist/services/bulk-import-service.d.ts +35 -0
  21. package/dist/services/bulk-import-service.js +105 -0
  22. package/dist/services/converters.d.ts +57 -0
  23. package/dist/services/converters.js +254 -0
  24. package/dist/services/data-service.d.ts +44 -0
  25. package/dist/services/data-service.js +206 -0
  26. package/dist/services/graph-service.d.ts +32 -0
  27. package/dist/services/graph-service.js +127 -0
  28. package/dist/services/health-service.d.ts +50 -0
  29. package/dist/services/health-service.js +78 -0
  30. package/dist/services/index.d.ts +13 -0
  31. package/dist/services/index.js +30 -0
  32. package/dist/services/query-service.d.ts +39 -0
  33. package/dist/services/query-service.js +112 -0
  34. package/dist/services/service-context.d.ts +39 -0
  35. package/dist/services/service-context.js +73 -0
  36. package/dist/services/session-service.d.ts +24 -0
  37. package/dist/services/session-service.js +66 -0
  38. package/dist/services/transaction-service.d.ts +33 -0
  39. package/dist/services/transaction-service.js +100 -0
  40. package/dist/services.d.ts +28 -0
  41. package/dist/services.js +122 -0
  42. package/dist/session.d.ts +45 -0
  43. package/dist/session.js +75 -0
  44. package/dist/transaction.d.ts +42 -0
  45. package/dist/transaction.js +89 -0
  46. package/dist/types/bulk_import.d.ts +53 -0
  47. package/dist/types/bulk_import.js +6 -0
  48. package/dist/types/data_types.d.ts +116 -0
  49. package/dist/types/data_types.js +122 -0
  50. package/dist/types/enums.d.ts +59 -0
  51. package/dist/types/enums.js +67 -0
  52. package/dist/types/graph_models.d.ts +54 -0
  53. package/dist/types/graph_models.js +6 -0
  54. package/dist/types/index.d.ts +11 -5
  55. package/dist/types/index.js +36 -37
  56. package/dist/types/metadata.d.ts +107 -0
  57. package/dist/types/metadata.js +6 -0
  58. package/dist/types/schema.d.ts +31 -0
  59. package/dist/types/schema.js +6 -0
  60. package/dist/types/typed_value.d.ts +25 -0
  61. package/dist/types/typed_value.js +1176 -0
  62. package/dist/types/wrappers.d.ts +23 -0
  63. package/dist/types/wrappers.js +39 -0
  64. package/dist/types.d.ts +7 -0
  65. package/dist/types.js +24 -0
  66. package/package.json +50 -63
  67. package/dist/connection/connection.final.d.ts +0 -14
  68. package/dist/connection/connection.final.js +0 -94
  69. package/dist/connection/connection.final.js.map +0 -1
  70. package/dist/connection/connection.pool.d.ts +0 -21
  71. package/dist/connection/connection.pool.js +0 -103
  72. package/dist/connection/connection.pool.js.map +0 -1
  73. package/dist/connection/extra/algos/algo.extra.d.ts +0 -34
  74. package/dist/connection/extra/algos/algo.extra.js +0 -69
  75. package/dist/connection/extra/algos/algo.extra.js.map +0 -1
  76. package/dist/connection/extra/algos/algo.utils.d.ts +0 -3
  77. package/dist/connection/extra/algos/algo.utils.js +0 -54
  78. package/dist/connection/extra/algos/algo.utils.js.map +0 -1
  79. package/dist/connection/extra/algos/community.d.ts +0 -27
  80. package/dist/connection/extra/algos/community.js +0 -76
  81. package/dist/connection/extra/algos/community.js.map +0 -1
  82. package/dist/connection/extra/algos/degrees.d.ts +0 -10
  83. package/dist/connection/extra/algos/degrees.js +0 -24
  84. package/dist/connection/extra/algos/degrees.js.map +0 -1
  85. package/dist/connection/extra/algos/embedding.d.ts +0 -13
  86. package/dist/connection/extra/algos/embedding.js +0 -33
  87. package/dist/connection/extra/algos/embedding.js.map +0 -1
  88. package/dist/connection/extra/algos/index.d.ts +0 -5
  89. package/dist/connection/extra/algos/index.js +0 -14
  90. package/dist/connection/extra/algos/index.js.map +0 -1
  91. package/dist/connection/extra/base.extra.d.ts +0 -18
  92. package/dist/connection/extra/base.extra.js +0 -111
  93. package/dist/connection/extra/base.extra.js.map +0 -1
  94. package/dist/connection/extra/batch.insert.extra.d.ts +0 -58
  95. package/dist/connection/extra/batch.insert.extra.js +0 -354
  96. package/dist/connection/extra/batch.insert.extra.js.map +0 -1
  97. package/dist/connection/extra/connection.base.d.ts +0 -112
  98. package/dist/connection/extra/connection.base.js +0 -530
  99. package/dist/connection/extra/connection.base.js.map +0 -1
  100. package/dist/connection/extra/connection.d.ts +0 -17
  101. package/dist/connection/extra/connection.js +0 -44
  102. package/dist/connection/extra/connection.js.map +0 -1
  103. package/dist/connection/extra/graph.extra.d.ts +0 -54
  104. package/dist/connection/extra/graph.extra.js +0 -151
  105. package/dist/connection/extra/graph.extra.js.map +0 -1
  106. package/dist/connection/extra/hdc.extra.d.ts +0 -89
  107. package/dist/connection/extra/hdc.extra.js +0 -322
  108. package/dist/connection/extra/hdc.extra.js.map +0 -1
  109. package/dist/connection/extra/index.extra.d.ts +0 -102
  110. package/dist/connection/extra/index.extra.js +0 -210
  111. package/dist/connection/extra/index.extra.js.map +0 -1
  112. package/dist/connection/extra/job.extra.d.ts +0 -32
  113. package/dist/connection/extra/job.extra.js +0 -122
  114. package/dist/connection/extra/job.extra.js.map +0 -1
  115. package/dist/connection/extra/meta.extra.d.ts +0 -36
  116. package/dist/connection/extra/meta.extra.js +0 -123
  117. package/dist/connection/extra/meta.extra.js.map +0 -1
  118. package/dist/connection/extra/policy.extra.d.ts +0 -32
  119. package/dist/connection/extra/policy.extra.js +0 -114
  120. package/dist/connection/extra/policy.extra.js.map +0 -1
  121. package/dist/connection/extra/privilege.extra.d.ts +0 -8
  122. package/dist/connection/extra/privilege.extra.js +0 -20
  123. package/dist/connection/extra/privilege.extra.js.map +0 -1
  124. package/dist/connection/extra/property.extra.d.ts +0 -66
  125. package/dist/connection/extra/property.extra.js +0 -190
  126. package/dist/connection/extra/property.extra.js.map +0 -1
  127. package/dist/connection/extra/schema.extra.d.ts +0 -108
  128. package/dist/connection/extra/schema.extra.js +0 -253
  129. package/dist/connection/extra/schema.extra.js.map +0 -1
  130. package/dist/connection/extra/search.extra.d.ts +0 -12
  131. package/dist/connection/extra/search.extra.js +0 -117
  132. package/dist/connection/extra/search.extra.js.map +0 -1
  133. package/dist/connection/extra/task.extra.d.ts +0 -24
  134. package/dist/connection/extra/task.extra.js +0 -107
  135. package/dist/connection/extra/task.extra.js.map +0 -1
  136. package/dist/connection/extra/user.extra.d.ts +0 -28
  137. package/dist/connection/extra/user.extra.js +0 -91
  138. package/dist/connection/extra/user.extra.js.map +0 -1
  139. package/dist/connection/extra/user.privilege.extra.d.ts +0 -64
  140. package/dist/connection/extra/user.privilege.extra.js +0 -273
  141. package/dist/connection/extra/user.privilege.extra.js.map +0 -1
  142. package/dist/connection/index.d.ts +0 -5
  143. package/dist/connection/index.js +0 -13
  144. package/dist/connection/index.js.map +0 -1
  145. package/dist/connection/network.manager.d.ts +0 -28
  146. package/dist/connection/network.manager.js +0 -179
  147. package/dist/connection/network.manager.js.map +0 -1
  148. package/dist/index.js.map +0 -1
  149. package/dist/printers/alias.d.ts +0 -2
  150. package/dist/printers/alias.js +0 -39
  151. package/dist/printers/alias.js.map +0 -1
  152. package/dist/printers/any.d.ts +0 -2
  153. package/dist/printers/any.js +0 -63
  154. package/dist/printers/any.js.map +0 -1
  155. package/dist/printers/array.aio.d.ts +0 -3
  156. package/dist/printers/array.aio.js +0 -259
  157. package/dist/printers/array.aio.js.map +0 -1
  158. package/dist/printers/common.d.ts +0 -0
  159. package/dist/printers/common.js +0 -1
  160. package/dist/printers/common.js.map +0 -1
  161. package/dist/printers/edge.d.ts +0 -5
  162. package/dist/printers/edge.js +0 -78
  163. package/dist/printers/edge.js.map +0 -1
  164. package/dist/printers/explain.plan.d.ts +0 -2
  165. package/dist/printers/explain.plan.js +0 -46
  166. package/dist/printers/explain.plan.js.map +0 -1
  167. package/dist/printers/index.d.ts +0 -24
  168. package/dist/printers/index.js +0 -43
  169. package/dist/printers/index.js.map +0 -1
  170. package/dist/printers/node.d.ts +0 -5
  171. package/dist/printers/node.js +0 -77
  172. package/dist/printers/node.js.map +0 -1
  173. package/dist/printers/path.d.ts +0 -3
  174. package/dist/printers/path.js +0 -62
  175. package/dist/printers/path.js.map +0 -1
  176. package/dist/printers/status.d.ts +0 -3
  177. package/dist/printers/status.js +0 -68
  178. package/dist/printers/status.js.map +0 -1
  179. package/dist/printers/table.d.ts +0 -2
  180. package/dist/printers/table.js +0 -56
  181. package/dist/printers/table.js.map +0 -1
  182. package/dist/proto/tmp.js +0 -366
  183. package/dist/proto/ultipa_grpc_pb.d.ts +0 -258
  184. package/dist/proto/ultipa_grpc_pb.js +0 -366
  185. package/dist/proto/ultipa_grpc_pb.js.map +0 -1
  186. package/dist/proto/ultipa_pb.d.ts +0 -1
  187. package/dist/proto/ultipa_pb.js +0 -12119
  188. package/dist/proto/ultipa_pb.js.map +0 -1
  189. package/dist/types/index.js.map +0 -1
  190. package/dist/types/types.algos.params.d.ts +0 -545
  191. package/dist/types/types.algos.params.js +0 -16
  192. package/dist/types/types.algos.params.js.map +0 -1
  193. package/dist/types/types.d.ts +0 -1214
  194. package/dist/types/types.extra.d.ts +0 -146
  195. package/dist/types/types.extra.js +0 -27
  196. package/dist/types/types.extra.js.map +0 -1
  197. package/dist/types/types.js +0 -1606
  198. package/dist/types/types.js.map +0 -1
  199. package/dist/types/util.d.ts +0 -15
  200. package/dist/types/util.js +0 -136
  201. package/dist/types/util.js.map +0 -1
  202. package/dist/utils/common.d.ts +0 -3
  203. package/dist/utils/common.js +0 -22
  204. package/dist/utils/common.js.map +0 -1
  205. package/dist/utils/config.d.ts +0 -3
  206. package/dist/utils/config.js +0 -7
  207. package/dist/utils/config.js.map +0 -1
  208. package/dist/utils/format.d.ts +0 -45
  209. package/dist/utils/format.js +0 -879
  210. package/dist/utils/format.js.map +0 -1
  211. package/dist/utils/index.d.ts +0 -10
  212. package/dist/utils/index.js +0 -30
  213. package/dist/utils/index.js.map +0 -1
  214. package/dist/utils/params.validate.d.ts +0 -4
  215. package/dist/utils/params.validate.js +0 -14
  216. package/dist/utils/params.validate.js.map +0 -1
  217. package/dist/utils/property.d.ts +0 -24
  218. package/dist/utils/property.js +0 -203
  219. package/dist/utils/property.js.map +0 -1
  220. package/dist/utils/raft.retry.d.ts +0 -0
  221. package/dist/utils/raft.retry.js +0 -1
  222. package/dist/utils/raft.retry.js.map +0 -1
  223. package/dist/utils/serialize/commont.d.ts +0 -12
  224. package/dist/utils/serialize/commont.js +0 -46
  225. package/dist/utils/serialize/commont.js.map +0 -1
  226. package/dist/utils/serialize/deserialize.d.ts +0 -10
  227. package/dist/utils/serialize/deserialize.js +0 -288
  228. package/dist/utils/serialize/deserialize.js.map +0 -1
  229. package/dist/utils/serialize/null.d.ts +0 -32
  230. package/dist/utils/serialize/null.js +0 -178
  231. package/dist/utils/serialize/null.js.map +0 -1
  232. package/dist/utils/serialize/serialize.d.ts +0 -10
  233. package/dist/utils/serialize/serialize.js +0 -146
  234. package/dist/utils/serialize/serialize.js.map +0 -1
  235. package/dist/utils/stream.helper.d.ts +0 -10
  236. package/dist/utils/stream.helper.js +0 -71
  237. package/dist/utils/stream.helper.js.map +0 -1
  238. package/dist/utils/time.record.d.ts +0 -15
  239. package/dist/utils/time.record.js +0 -52
  240. package/dist/utils/time.record.js.map +0 -1
  241. package/dist/utils/timezone.d.ts +0 -7
  242. package/dist/utils/timezone.js +0 -21
  243. package/dist/utils/timezone.js.map +0 -1
  244. package/dist/utils/ultipa.datetime.d.ts +0 -14
  245. package/dist/utils/ultipa.datetime.js +0 -160
  246. package/dist/utils/ultipa.datetime.js.map +0 -1
  247. package/dist/utils/uql-maker.d.ts +0 -165
  248. package/dist/utils/uql-maker.js +0 -402
  249. package/dist/utils/uql-maker.js.map +0 -1
  250. package/dist/utils/uql.parse.d.ts +0 -27
  251. package/dist/utils/uql.parse.js +0 -205
  252. package/dist/utils/uql.parse.js.map +0 -1
  253. package/readme.md +0 -65
  254. package/src/proto/build.sh +0 -41
  255. package/src/proto/build_windows.sh +0 -40
  256. package/src/proto/ultipa.proto +0 -531
  257. package/src/proto/ultipa_grpc_pb.d.ts +0 -92
  258. package/src/proto/ultipa_grpc_pb.js +0 -414
  259. package/src/proto/ultipa_pb.d.ts +0 -1983
  260. package/src/proto/ultipa_pb.js +0 -14852
package/dist/client.js ADDED
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+ /**
3
+ * Main client for GQLDB Node.js driver.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.GqldbClient = void 0;
40
+ const grpc = __importStar(require("@grpc/grpc-js"));
41
+ const config_1 = require("./config");
42
+ const session_1 = require("./session");
43
+ const transaction_1 = require("./transaction");
44
+ const types_1 = require("./types");
45
+ const services_1 = require("./services");
46
+ const index_1 = require("./services/index");
47
+ /** Main client for interacting with GQLDB */
48
+ class GqldbClient {
49
+ config;
50
+ clients;
51
+ sessions;
52
+ txManager;
53
+ closed = false;
54
+ // Service instances
55
+ sessionService;
56
+ queryService;
57
+ graphService;
58
+ transactionService;
59
+ dataService;
60
+ healthService;
61
+ adminService;
62
+ bulkImportService;
63
+ /** Get session metadata for authenticated requests */
64
+ getSessionMetadata() {
65
+ const metadata = new grpc.Metadata();
66
+ const session = this.sessions.getSession();
67
+ metadata.add('session-id', session?.id?.toString() || '0');
68
+ return metadata;
69
+ }
70
+ constructor(config) {
71
+ (0, config_1.validateConfig)(config);
72
+ this.config = config;
73
+ this.sessions = new session_1.SessionManager();
74
+ this.txManager = new transaction_1.TransactionManager();
75
+ // Create gRPC credentials
76
+ let credentials;
77
+ if (config.tlsOptions) {
78
+ credentials = grpc.credentials.createSsl();
79
+ }
80
+ else {
81
+ credentials = grpc.credentials.createInsecure();
82
+ }
83
+ // Channel options
84
+ const options = {
85
+ 'grpc.max_receive_message_length': config.maxRecvSize ?? 4 * 1024 * 1024,
86
+ 'grpc.keepalive_time_ms': 30000,
87
+ 'grpc.keepalive_timeout_ms': 10000,
88
+ };
89
+ // Create service clients for the first host
90
+ const host = config.hosts[0];
91
+ this.clients = (0, services_1.createServiceClients)(host, credentials, options);
92
+ // Initialize service context
93
+ const ctx = new index_1.ServiceContext(this.config, this.sessions, this.txManager, this.clients);
94
+ // Initialize service instances
95
+ this.sessionService = new index_1.SessionService(ctx);
96
+ this.queryService = new index_1.QueryService(ctx);
97
+ this.graphService = new index_1.GraphService(ctx);
98
+ this.transactionService = new index_1.TransactionService(ctx);
99
+ this.dataService = new index_1.DataService(ctx);
100
+ this.healthService = new index_1.HealthService(ctx);
101
+ this.adminService = new index_1.AdminService(ctx);
102
+ this.bulkImportService = new index_1.BulkImportService(ctx);
103
+ }
104
+ /** Close the client and all connections */
105
+ async close() {
106
+ if (this.closed)
107
+ return;
108
+ this.closed = true;
109
+ if (this.sessions.isLoggedIn()) {
110
+ try {
111
+ await this.logout();
112
+ }
113
+ catch (e) {
114
+ // Ignore logout errors during close
115
+ }
116
+ }
117
+ // Close all service clients
118
+ try {
119
+ this.clients.sessionService.close?.();
120
+ this.clients.queryService.close?.();
121
+ this.clients.graphService.close?.();
122
+ this.clients.transactionService.close?.();
123
+ this.clients.dataService.close?.();
124
+ this.clients.healthService.close?.();
125
+ this.clients.adminService.close?.();
126
+ this.clients.bulkImportService.close?.();
127
+ }
128
+ catch (e) {
129
+ // Ignore close errors
130
+ }
131
+ }
132
+ // ===========================================================================
133
+ // Session Service
134
+ // ===========================================================================
135
+ /** Authenticate the user and create a session */
136
+ async login(username, password) {
137
+ return this.sessionService.login(username, password, this.config.defaultGraph || '');
138
+ }
139
+ /** Terminate the current session */
140
+ async logout() {
141
+ return this.sessionService.logout();
142
+ }
143
+ /** Check the connection and return the latency in nanoseconds */
144
+ async ping() {
145
+ return this.sessionService.ping();
146
+ }
147
+ // ===========================================================================
148
+ // Query Service
149
+ // ===========================================================================
150
+ /** Execute a GQL query and return the result */
151
+ async gql(query, config) {
152
+ return this.queryService.gql(query, config);
153
+ }
154
+ /** Execute a GQL query and stream the results */
155
+ async gqlStream(query, config, callback) {
156
+ return this.queryService.gqlStream(query, config, callback);
157
+ }
158
+ /** Return the execution plan for a query */
159
+ async explain(query, config) {
160
+ return this.queryService.explain(query, config);
161
+ }
162
+ /** Execute a query with profiling and return statistics */
163
+ async profile(query, config) {
164
+ return this.queryService.profile(query, config);
165
+ }
166
+ // ===========================================================================
167
+ // Graph Service
168
+ // ===========================================================================
169
+ /** Create a new graph */
170
+ async createGraph(name, graphType = types_1.GraphType.OPEN, description = '') {
171
+ return this.graphService.createGraph(name, graphType, description);
172
+ }
173
+ /** Delete a graph */
174
+ async dropGraph(name, ifExists = false) {
175
+ return this.graphService.dropGraph(name, ifExists);
176
+ }
177
+ /** Set the current graph for the session */
178
+ async useGraph(name) {
179
+ return this.graphService.useGraph(name);
180
+ }
181
+ /** Return all available graphs */
182
+ async listGraphs() {
183
+ return this.graphService.listGraphs();
184
+ }
185
+ /** Return information about a specific graph */
186
+ async getGraphInfo(name) {
187
+ return this.graphService.getGraphInfo(name);
188
+ }
189
+ // ===========================================================================
190
+ // Transaction Service
191
+ // ===========================================================================
192
+ /** Start a new transaction */
193
+ async beginTransaction(graphName, readOnly = false, timeout = 0) {
194
+ return this.transactionService.beginTransaction(graphName, readOnly, timeout);
195
+ }
196
+ /** Commit a transaction */
197
+ async commit(transactionId) {
198
+ return this.transactionService.commit(transactionId);
199
+ }
200
+ /** Rollback a transaction */
201
+ async rollback(transactionId) {
202
+ return this.transactionService.rollback(transactionId);
203
+ }
204
+ /** Return active transactions */
205
+ async listTransactions() {
206
+ return this.transactionService.listTransactions();
207
+ }
208
+ /** Execute a function within a transaction */
209
+ async withTransaction(graphName, fn, readOnly = false) {
210
+ return this.transactionService.withTransaction(graphName, fn, readOnly);
211
+ }
212
+ // ===========================================================================
213
+ // Data Service
214
+ // ===========================================================================
215
+ /** Insert multiple nodes into a graph */
216
+ async insertNodes(graphName, nodes, config) {
217
+ return this.dataService.insertNodes(graphName, nodes, config);
218
+ }
219
+ /** Insert multiple edges into a graph */
220
+ async insertEdges(graphName, edges, config) {
221
+ return this.dataService.insertEdges(graphName, edges, config);
222
+ }
223
+ /** Delete nodes from a graph */
224
+ async deleteNodes(graphName, nodeIds, labels, where) {
225
+ return this.dataService.deleteNodes(graphName, nodeIds, labels, where);
226
+ }
227
+ /** Delete edges from a graph */
228
+ async deleteEdges(graphName, edgeIds, label, where) {
229
+ return this.dataService.deleteEdges(graphName, edgeIds, label, where);
230
+ }
231
+ /**
232
+ * Export graph data in JSON Lines format (streaming).
233
+ * @param config Export configuration
234
+ * @param callback Callback for each exported chunk
235
+ */
236
+ async export(config, callback) {
237
+ return this.dataService.export(config, callback);
238
+ }
239
+ /**
240
+ * Stream nodes from a graph
241
+ * @deprecated Use export() with ExportConfig instead
242
+ */
243
+ async exportNodes(graphName, labels, limit = 0, callback) {
244
+ return this.dataService.exportNodes(graphName, labels, limit, callback);
245
+ }
246
+ /**
247
+ * Stream edges from a graph
248
+ * @deprecated Use export() with ExportConfig instead
249
+ */
250
+ async exportEdges(graphName, labels, limit = 0, callback) {
251
+ return this.dataService.exportEdges(graphName, labels, limit, callback);
252
+ }
253
+ // ===========================================================================
254
+ // Health Service
255
+ // ===========================================================================
256
+ /** Check the health of a service */
257
+ async healthCheck(service = '') {
258
+ return this.healthService.healthCheck(service);
259
+ }
260
+ /**
261
+ * Watch health status changes via server-side streaming.
262
+ * Returns a HealthWatcher that emits 'status' events with HealthStatus values.
263
+ * Call stop() to cancel the stream.
264
+ *
265
+ * @param service - Optional service name to watch
266
+ * @returns HealthWatcher - EventEmitter with stop() method
267
+ *
268
+ * @example
269
+ * ```typescript
270
+ * const watcher = client.watch();
271
+ * watcher.on('status', (status: HealthStatus) => {
272
+ * console.log('Health status:', status);
273
+ * });
274
+ * watcher.on('error', (err) => {
275
+ * console.error('Watch error:', err);
276
+ * });
277
+ * watcher.on('end', () => {
278
+ * console.log('Watch stream ended');
279
+ * });
280
+ * // Later, to stop watching:
281
+ * watcher.stop();
282
+ * ```
283
+ */
284
+ watch(service = '') {
285
+ return this.healthService.watch(service);
286
+ }
287
+ // ===========================================================================
288
+ // Admin Service
289
+ // ===========================================================================
290
+ /** Pre-allocate parser instances */
291
+ async warmupParser(count) {
292
+ return this.adminService.warmupParser(count);
293
+ }
294
+ /** Return cache statistics */
295
+ async getCacheStats(cacheType = types_1.CacheType.ALL) {
296
+ return this.adminService.getCacheStats(cacheType);
297
+ }
298
+ /** Clear the specified cache */
299
+ async clearCache(cacheType = types_1.CacheType.ALL) {
300
+ return this.adminService.clearCache(cacheType);
301
+ }
302
+ /** Return database statistics */
303
+ async getStatistics(graphName = '') {
304
+ return this.adminService.getStatistics(graphName);
305
+ }
306
+ /** Invalidate the RBAC permission cache */
307
+ async invalidatePermissionCache(username = '') {
308
+ return this.adminService.invalidatePermissionCache(username);
309
+ }
310
+ /** Return system-level metrics (CPU, memory, disk I/O, storage, network) */
311
+ async getSystemMetrics() {
312
+ return this.adminService.getSystemMetrics();
313
+ }
314
+ /** Trigger manual compaction of the database storage */
315
+ async compact() {
316
+ return this.adminService.compact();
317
+ }
318
+ /** Wait for the computing engine topology to be ready */
319
+ async waitForComputeTopology(graphName, timeoutMs = 0) {
320
+ return this.adminService.waitForComputeTopology(graphName, timeoutMs);
321
+ }
322
+ // ===========================================================================
323
+ // Bulk Import Service
324
+ // ===========================================================================
325
+ /**
326
+ * Start a bulk import session for optimized high-throughput inserts.
327
+ * @param graphName Target graph name
328
+ * @param options Optional bulk import configuration
329
+ */
330
+ async startBulkImport(graphName, options) {
331
+ return this.bulkImportService.startBulkImport(graphName, options);
332
+ }
333
+ /**
334
+ * @deprecated Checkpoint is no longer needed. Use endBulkImport() which performs a final flush.
335
+ */
336
+ async checkpoint(sessionId) {
337
+ return {
338
+ success: true,
339
+ recordCount: 0,
340
+ lastCheckpointCount: 0,
341
+ message: 'Checkpoint has been removed; use endBulkImport which performs a final flush',
342
+ };
343
+ }
344
+ /**
345
+ * End the bulk import session with a final checkpoint.
346
+ * @param sessionId Bulk import session ID
347
+ */
348
+ async endBulkImport(sessionId) {
349
+ return this.bulkImportService.endBulkImport(sessionId);
350
+ }
351
+ /**
352
+ * Cancel the bulk import session without final sync.
353
+ * @param sessionId Bulk import session ID
354
+ */
355
+ async abortBulkImport(sessionId) {
356
+ return this.bulkImportService.abortBulkImport(sessionId);
357
+ }
358
+ /**
359
+ * Return the current status of a bulk import session.
360
+ * @param sessionId Bulk import session ID
361
+ */
362
+ async getBulkImportStatus(sessionId) {
363
+ return this.bulkImportService.getBulkImportStatus(sessionId);
364
+ }
365
+ // ===========================================================================
366
+ // Convenience Methods
367
+ // ===========================================================================
368
+ /** Get the current session */
369
+ getSession() {
370
+ return this.sessions.getSession();
371
+ }
372
+ /** Check if there is an active session */
373
+ isLoggedIn() {
374
+ return this.sessions.isLoggedIn();
375
+ }
376
+ /** Get the client configuration */
377
+ getConfig() {
378
+ return this.config;
379
+ }
380
+ /** Whether this client is connected to a cluster deployment */
381
+ get isCluster() {
382
+ return this.sessions.getSession()?.isCluster || false;
383
+ }
384
+ /** Get the cluster ID (empty string if not a cluster) */
385
+ get clusterId() {
386
+ return this.sessions.getSession()?.clusterId || '';
387
+ }
388
+ /** Get the partition count (0 if not a cluster) */
389
+ get partitionCount() {
390
+ return this.sessions.getSession()?.partitionCount || 0;
391
+ }
392
+ }
393
+ exports.GqldbClient = GqldbClient;
394
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFjdkQsdUNBQW9EO0FBQ3BELCtDQUFnRTtBQUNoRSxtQ0FxQmlCO0FBQ2pCLHlDQUE0RjtBQUM1Riw0Q0FXMEI7QUFrQzFCLDZDQUE2QztBQUM3QyxNQUFhLFdBQVc7SUFDZCxNQUFNLENBQWM7SUFDcEIsT0FBTyxDQUFpQjtJQUN4QixRQUFRLENBQWlCO0lBQ3pCLFNBQVMsQ0FBcUI7SUFDOUIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV2QixvQkFBb0I7SUFDWixjQUFjLENBQWlCO0lBQy9CLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0Isa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUN6QixhQUFhLENBQWdCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixpQkFBaUIsQ0FBb0I7SUFFN0Msc0RBQXNEO0lBQzlDLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7UUFDM0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFlBQVksTUFBbUI7UUFDN0IsSUFBQSx1QkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSx3QkFBYyxFQUFFLENBQUM7UUFD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LENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQWlCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFNBQWlCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsc0JBQXNCO0lBQ3RCLDhFQUE4RTtJQUU5RSw4QkFBOEI7SUFDOUIsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsSUFBSSxLQUFLLENBQUM7SUFDeEQsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUFwY0Qsa0NBb2NDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYWluIGNsaWVudCBmb3IgR1FMREIgTm9kZS5qcyBkcml2ZXIuXG4gKi9cblxuaW1wb3J0ICogYXMgZ3JwYyBmcm9tICdAZ3JwYy9ncnBjLWpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBHcWxkYkNvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBFbXB0eVF1ZXJ5RXJyb3IsIExvZ2luRmFpbGVkRXJyb3IsIFF1ZXJ5RmFpbGVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge1xuICBSZXNwb25zZSxcbiAgUm93LFxuICBJbnNlcnROb2Rlc1Jlc3VsdCxcbiAgSW5zZXJ0RWRnZXNSZXN1bHQsXG4gIERlbGV0ZVJlc3VsdCxcbiAgRXhwb3J0Tm9kZXNSZXN1bHQsXG4gIEV4cG9ydEVkZ2VzUmVzdWx0LFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydENodW5rLFxuICBFeHBvcnRTdGF0cyxcbn0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJy4vc2Vzc2lvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBHcmFwaEluZm8sXG4gIEdyYXBoVHlwZSxcbiAgSGVhbHRoU3RhdHVzLFxuICBDYWNoZVN0YXRzLFxuICBDYWNoZVR5cGUsXG4gIFN0YXRpc3RpY3MsXG4gIENvbXBhY3RSZXN1bHQsXG4gIENvbXB1dGVUb3BvbG9neVJlc3VsdCxcbiAgU3lzdGVtTWV0cmljcyxcbiAgTm9kZURhdGEsXG4gIEVkZ2VEYXRhLFxuICBCdWxrQ3JlYXRlTm9kZXNPcHRpb25zLFxuICBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zLFxuICBCdWxrSW1wb3J0T3B0aW9ucyxcbiAgQnVsa0ltcG9ydFNlc3Npb24sXG4gIENoZWNrcG9pbnRSZXN1bHQsXG4gIEVuZEJ1bGtJbXBvcnRSZXN1bHQsXG4gIEFib3J0QnVsa0ltcG9ydFJlc3VsdCxcbiAgQnVsa0ltcG9ydFN0YXR1cyxcbiAgVHJhbnNhY3Rpb25JbmZvLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNlcnZpY2VDbGllbnRzLCBwcm9taXNpZnlDYWxsLCBwcm9taXNpZnlDYWxsV2l0aERlYWRsaW5lIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICBTZXJ2aWNlQ29udGV4dCxcbiAgU2VydmljZUNsaWVudHMsXG4gIFNlc3Npb25TZXJ2aWNlLFxuICBRdWVyeVNlcnZpY2UsXG4gIEdyYXBoU2VydmljZSxcbiAgVHJhbnNhY3Rpb25TZXJ2aWNlLFxuICBEYXRhU2VydmljZSxcbiAgSGVhbHRoU2VydmljZSxcbiAgQWRtaW5TZXJ2aWNlLFxuICBCdWxrSW1wb3J0U2VydmljZSxcbn0gZnJvbSAnLi9zZXJ2aWNlcy9pbmRleCc7XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBhIHF1ZXJ5ICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q29uZmlnIHtcbiAgZ3JhcGhOYW1lPzogc3RyaW5nO1xuICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgdHJhbnNhY3Rpb25JZD86IG51bWJlcjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogTWF4IHBhdGhzIHRvIHJldHVybiBmcm9tIHBhdGggcXVlcmllcyAoMCA9IHVubGltaXRlZCkgKi9cbiAgbWF4UGF0aFJlc3VsdHM/OiBudW1iZXI7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgbm9kZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Tm9kZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZU5vZGVzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydCBlZGdlcyAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRFZGdlc0NvbmZpZyB7XG4gIG9wdGlvbnM/OiBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zO1xuICBidWxrSW1wb3J0U2Vzc2lvbklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlYWx0aCB3YXRjaGVyIGludGVyZmFjZSBmb3Igc3RyZWFtaW5nIGhlYWx0aCB1cGRhdGVzLlxuICogRW1pdHMgJ3N0YXR1cycgZXZlbnRzIHdpdGggSGVhbHRoU3RhdHVzIGFuZCAnZXJyb3InIGV2ZW50cyBvbiBmYWlsdXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aFdhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKiogU3RvcCB3YXRjaGluZyBoZWFsdGggdXBkYXRlcyAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKiBNYWluIGNsaWVudCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBHUUxEQiAqL1xuZXhwb3J0IGNsYXNzIEdxbGRiQ2xpZW50IHtcbiAgcHJpdmF0ZSBjb25maWc6IEdxbGRiQ29uZmlnO1xuICBwcml2YXRlIGNsaWVudHM6IFNlcnZpY2VDbGllbnRzO1xuICBwcml2YXRlIHNlc3Npb25zOiBTZXNzaW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSB0eE1hbmFnZXI6IFRyYW5zYWN0aW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcblxuICAvLyBTZXJ2aWNlIGluc3RhbmNlc1xuICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZTtcbiAgcHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZTtcbiAgcHJpdmF0ZSBncmFwaFNlcnZpY2U6IEdyYXBoU2VydmljZTtcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvblNlcnZpY2U6IFRyYW5zYWN0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XG4gIHByaXZhdGUgaGVhbHRoU2VydmljZTogSGVhbHRoU2VydmljZTtcbiAgcHJpdmF0ZSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZTtcbiAgcHJpdmF0ZSBidWxrSW1wb3J0U2VydmljZTogQnVsa0ltcG9ydFNlcnZpY2U7XG5cbiAgLyoqIEdldCBzZXNzaW9uIG1ldGFkYXRhIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzICovXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbk1ldGFkYXRhKCk6IGdycGMuTWV0YWRhdGEge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IGdycGMuTWV0YWRhdGEoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gICAgbWV0YWRhdGEuYWRkKCdzZXNzaW9uLWlkJywgc2Vzc2lvbj8uaWQ/LnRvU3RyaW5nKCkgfHwgJzAnKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdxbGRiQ29uZmlnKSB7XG4gICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNlc3Npb25zID0gbmV3IFNlc3Npb25NYW5hZ2VyKCk7XG4gICAgdGhpcy50eE1hbmFnZXIgPSBuZXcgVHJhbnNhY3Rpb25NYW5hZ2VyKCk7XG5cbiAgICAvLyBDcmVhdGUgZ1JQQyBjcmVkZW50aWFsc1xuICAgIGxldCBjcmVkZW50aWFsczogZ3JwYy5DaGFubmVsQ3JlZGVudGlhbHM7XG4gICAgaWYgKGNvbmZpZy50bHNPcHRpb25zKSB7XG4gICAgICBjcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlU3NsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVJbnNlY3VyZSgpO1xuICAgIH1cblxuICAgIC8vIENoYW5uZWwgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnM6IGdycGMuQ2hhbm5lbE9wdGlvbnMgPSB7XG4gICAgICAnZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aCc6IGNvbmZpZy5tYXhSZWN2U2l6ZSA/PyA0ICogMTAyNCAqIDEwMjQsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfdGltZV9tcyc6IDMwMDAwLFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3RpbWVvdXRfbXMnOiAxMDAwMCxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIHNlcnZpY2UgY2xpZW50cyBmb3IgdGhlIGZpcnN0IGhvc3RcbiAgICBjb25zdCBob3N0ID0gY29uZmlnLmhvc3RzWzBdO1xuICAgIHRoaXMuY2xpZW50cyA9IGNyZWF0ZVNlcnZpY2VDbGllbnRzKGhvc3QsIGNyZWRlbnRpYWxzLCBvcHRpb25zKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBjb250ZXh0XG4gICAgY29uc3QgY3R4ID0gbmV3IFNlcnZpY2VDb250ZXh0KHRoaXMuY29uZmlnLCB0aGlzLnNlc3Npb25zLCB0aGlzLnR4TWFuYWdlciwgdGhpcy5jbGllbnRzKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcbiAgICB0aGlzLnNlc3Npb25TZXJ2aWNlID0gbmV3IFNlc3Npb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZShjdHgpO1xuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5hZG1pblNlcnZpY2UgPSBuZXcgQWRtaW5TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5idWxrSW1wb3J0U2VydmljZSA9IG5ldyBCdWxrSW1wb3J0U2VydmljZShjdHgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBjb25uZWN0aW9ucyAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBsb2dvdXQgZXJyb3JzIGR1cmluZyBjbG9zZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcbiAgICB0cnkge1xuICAgICAgKHRoaXMuY2xpZW50cy5zZXNzaW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5ncmFwaFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmhlYWx0aFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmFkbWluU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGNsb3NlIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZXNzaW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQgY3JlYXRlIGEgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xuICB9XG5cbiAgLyoqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBzZXNzaW9uICovXG4gIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uU2VydmljZS5sb2dvdXQoKTtcbiAgfVxuXG4gIC8qKiBDaGVjayB0aGUgY29ubmVjdGlvbiBhbmQgcmV0dXJuIHRoZSBsYXRlbmN5IGluIG5hbm9zZWNvbmRzICovXG4gIGFzeW5jIHBpbmcoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uU2VydmljZS5waW5nKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUXVlcnkgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogRXhlY3V0ZSBhIEdRTCBxdWVyeSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgKi9cbiAgYXN5bmMgZ3FsKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5ncWwocXVlcnksIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIEdRTCBxdWVyeSBhbmQgc3RyZWFtIHRoZSByZXN1bHRzICovXG4gIGFzeW5jIGdxbFN0cmVhbShcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnLFxuICAgIGNhbGxiYWNrPzogKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsU3RyZWFtKHF1ZXJ5LCBjb25maWcsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIGV4ZWN1dGlvbiBwbGFuIGZvciBhIHF1ZXJ5ICovXG4gIGFzeW5jIGV4cGxhaW4ocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5leHBsYWluKHF1ZXJ5LCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBxdWVyeSB3aXRoIHByb2ZpbGluZyBhbmQgcmV0dXJuIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgcHJvZmlsZShxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZXJ2aWNlLnByb2ZpbGUocXVlcnksIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gR3JhcGggU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ3JlYXRlIGEgbmV3IGdyYXBoICovXG4gIGFzeW5jIGNyZWF0ZUdyYXBoKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuY3JlYXRlR3JhcGgobmFtZSwgZ3JhcGhUeXBlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogRGVsZXRlIGEgZ3JhcGggKi9cbiAgYXN5bmMgZHJvcEdyYXBoKG5hbWU6IHN0cmluZywgaWZFeGlzdHM6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5kcm9wR3JhcGgobmFtZSwgaWZFeGlzdHMpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgY3VycmVudCBncmFwaCBmb3IgdGhlIHNlc3Npb24gKi9cbiAgYXN5bmMgdXNlR3JhcGgobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLnVzZUdyYXBoKG5hbWUpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgYXZhaWxhYmxlIGdyYXBocyAqL1xuICBhc3luYyBsaXN0R3JhcGhzKCk6IFByb21pc2U8R3JhcGhJbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UubGlzdEdyYXBocygpO1xuICB9XG5cbiAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGdyYXBoICovXG4gIGFzeW5jIGdldEdyYXBoSW5mbyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEdyYXBoSW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5nZXRHcmFwaEluZm8obmFtZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgYmVnaW5UcmFuc2FjdGlvbihcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHRpbWVvdXQ6IG51bWJlciA9IDBcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5iZWdpblRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgcmVhZE9ubHksIHRpbWVvdXQpO1xuICB9XG5cbiAgLyoqIENvbW1pdCBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIGNvbW1pdCh0cmFuc2FjdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuY29tbWl0KHRyYW5zYWN0aW9uSWQpO1xuICB9XG5cbiAgLyoqIFJvbGxiYWNrIGEgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgcm9sbGJhY2sodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLnJvbGxiYWNrKHRyYW5zYWN0aW9uSWQpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhY3RpdmUgdHJhbnNhY3Rpb25zICovXG4gIGFzeW5jIGxpc3RUcmFuc2FjdGlvbnMoKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9bXT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5saXN0VHJhbnNhY3Rpb25zKCk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGhpbiBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIHdpdGhUcmFuc2FjdGlvbjxUPihcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBmbjogKHR4SWQ6IG51bWJlcikgPT4gUHJvbWlzZTxUPixcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS53aXRoVHJhbnNhY3Rpb24oZ3JhcGhOYW1lLCBmbiwgcmVhZE9ubHkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERhdGEgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogSW5zZXJ0IG11bHRpcGxlIG5vZGVzIGludG8gYSBncmFwaCAqL1xuICBhc3luYyBpbnNlcnROb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlczogTm9kZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnROb2Rlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0Tm9kZXMoZ3JhcGhOYW1lLCBub2RlcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgZWRnZXMgaW50byBhIGdyYXBoICovXG4gIGFzeW5jIGluc2VydEVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydEVkZ2VzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnRFZGdlcyhncmFwaE5hbWUsIGVkZ2VzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBub2RlcyBmcm9tIGEgZ3JhcGggKi9cbiAgYXN5bmMgZGVsZXRlTm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZUlkcz86IHN0cmluZ1tdLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIHdoZXJlPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGVsZXRlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlTm9kZXMoZ3JhcGhOYW1lLCBub2RlSWRzLCBsYWJlbHMsIHdoZXJlKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZWRnZXMgZnJvbSBhIGdyYXBoICovXG4gIGFzeW5jIGRlbGV0ZUVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VJZHM/OiBzdHJpbmdbXSxcbiAgICBsYWJlbD86IHN0cmluZyxcbiAgICB3aGVyZT86IHN0cmluZ1xuICApOiBQcm9taXNlPERlbGV0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZUVkZ2VzKGdyYXBoTmFtZSwgZWRnZUlkcywgbGFiZWwsIHdoZXJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgZ3JhcGggZGF0YSBpbiBKU09OIExpbmVzIGZvcm1hdCAoc3RyZWFtaW5nKS5cbiAgICogQHBhcmFtIGNvbmZpZyBFeHBvcnQgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZm9yIGVhY2ggZXhwb3J0ZWQgY2h1bmtcbiAgICovXG4gIGFzeW5jIGV4cG9ydChcbiAgICBjb25maWc6IEV4cG9ydENvbmZpZyxcbiAgICBjYWxsYmFjaz86IChjaHVuazogRXhwb3J0Q2h1bmspID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0KGNvbmZpZywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBub2RlcyBmcm9tIGEgZ3JhcGhcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAgICovXG4gIGFzeW5jIGV4cG9ydE5vZGVzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxuICAgIGNhbGxiYWNrPzogKHJlc3VsdDogRXhwb3J0Tm9kZXNSZXN1bHQpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0Tm9kZXMoZ3JhcGhOYW1lLCBsYWJlbHMsIGxpbWl0LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIGVkZ2VzIGZyb20gYSBncmFwaFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnRFZGdlc1Jlc3VsdCkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnRFZGdlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIZWFsdGggU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ2hlY2sgdGhlIGhlYWx0aCBvZiBhIHNlcnZpY2UgKi9cbiAgYXN5bmMgaGVhbHRoQ2hlY2soc2VydmljZTogc3RyaW5nID0gJycpOiBQcm9taXNlPEhlYWx0aFN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmhlYWx0aFNlcnZpY2UuaGVhbHRoQ2hlY2soc2VydmljZSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2ggaGVhbHRoIHN0YXR1cyBjaGFuZ2VzIHZpYSBzZXJ2ZXItc2lkZSBzdHJlYW1pbmcuXG4gICAqIFJldHVybnMgYSBIZWFsdGhXYXRjaGVyIHRoYXQgZW1pdHMgJ3N0YXR1cycgZXZlbnRzIHdpdGggSGVhbHRoU3RhdHVzIHZhbHVlcy5cbiAgICogQ2FsbCBzdG9wKCkgdG8gY2FuY2VsIHRoZSBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlIC0gT3B0aW9uYWwgc2VydmljZSBuYW1lIHRvIHdhdGNoXG4gICAqIEByZXR1cm5zIEhlYWx0aFdhdGNoZXIgLSBFdmVudEVtaXR0ZXIgd2l0aCBzdG9wKCkgbWV0aG9kXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgd2F0Y2hlciA9IGNsaWVudC53YXRjaCgpO1xuICAgKiB3YXRjaGVyLm9uKCdzdGF0dXMnLCAoc3RhdHVzOiBIZWFsdGhTdGF0dXMpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnSGVhbHRoIHN0YXR1czonLCBzdGF0dXMpO1xuICAgKiB9KTtcbiAgICogd2F0Y2hlci5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAqICAgY29uc29sZS5lcnJvcignV2F0Y2ggZXJyb3I6JywgZXJyKTtcbiAgICogfSk7XG4gICAqIHdhdGNoZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnV2F0Y2ggc3RyZWFtIGVuZGVkJyk7XG4gICAqIH0pO1xuICAgKiAvLyBMYXRlciwgdG8gc3RvcCB3YXRjaGluZzpcbiAgICogd2F0Y2hlci5zdG9wKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2F0Y2goc2VydmljZTogc3RyaW5nID0gJycpOiBIZWFsdGhXYXRjaGVyIHtcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLndhdGNoKHNlcnZpY2UpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkbWluIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFByZS1hbGxvY2F0ZSBwYXJzZXIgaW5zdGFuY2VzICovXG4gIGFzeW5jIHdhcm11cFBhcnNlcihjb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhcm11cFBhcnNlcihjb3VudCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGNhY2hlIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgZ2V0Q2FjaGVTdGF0cyhjYWNoZVR5cGU6IENhY2hlVHlwZSA9IENhY2hlVHlwZS5BTEwpOiBQcm9taXNlPENhY2hlU3RhdHM+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0Q2FjaGVTdGF0cyhjYWNoZVR5cGUpO1xuICB9XG5cbiAgLyoqIENsZWFyIHRoZSBzcGVjaWZpZWQgY2FjaGUgKi9cbiAgYXN5bmMgY2xlYXJDYWNoZShjYWNoZVR5cGU6IENhY2hlVHlwZSA9IENhY2hlVHlwZS5BTEwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuY2xlYXJDYWNoZShjYWNoZVR5cGUpO1xuICB9XG5cbiAgLyoqIFJldHVybiBkYXRhYmFzZSBzdGF0aXN0aWNzICovXG4gIGFzeW5jIGdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8U3RhdGlzdGljcz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRTdGF0aXN0aWNzKGdyYXBoTmFtZSk7XG4gIH1cblxuICAvKiogSW52YWxpZGF0ZSB0aGUgUkJBQyBwZXJtaXNzaW9uIGNhY2hlICovXG4gIGFzeW5jIGludmFsaWRhdGVQZXJtaXNzaW9uQ2FjaGUodXNlcm5hbWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmludmFsaWRhdGVQZXJtaXNzaW9uQ2FjaGUodXNlcm5hbWUpO1xuICB9XG5cbiAgLyoqIFJldHVybiBzeXN0ZW0tbGV2ZWwgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGRpc2sgSS9PLCBzdG9yYWdlLCBuZXR3b3JrKSAqL1xuICBhc3luYyBnZXRTeXN0ZW1NZXRyaWNzKCk6IFByb21pc2U8U3lzdGVtTWV0cmljcz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRTeXN0ZW1NZXRyaWNzKCk7XG4gIH1cblxuICAvKiogVHJpZ2dlciBtYW51YWwgY29tcGFjdGlvbiBvZiB0aGUgZGF0YWJhc2Ugc3RvcmFnZSAqL1xuICBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8Q29tcGFjdFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jb21wYWN0KCk7XG4gIH1cblxuICAvKiogV2FpdCBmb3IgdGhlIGNvbXB1dGluZyBlbmdpbmUgdG9wb2xvZ3kgdG8gYmUgcmVhZHkgKi9cbiAgYXN5bmMgd2FpdEZvckNvbXB1dGVUb3BvbG9neShncmFwaE5hbWU6IHN0cmluZywgdGltZW91dE1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxDb21wdXRlVG9wb2xvZ3lSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2Uud2FpdEZvckNvbXB1dGVUb3BvbG9neShncmFwaE5hbWUsIHRpbWVvdXRNcyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQnVsayBJbXBvcnQgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU3RhcnQgYSBidWxrIGltcG9ydCBzZXNzaW9uIGZvciBvcHRpbWl6ZWQgaGlnaC10aHJvdWdocHV0IGluc2VydHMuXG4gICAqIEBwYXJhbSBncmFwaE5hbWUgVGFyZ2V0IGdyYXBoIG5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgYnVsayBpbXBvcnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgc3RhcnRCdWxrSW1wb3J0KGdyYXBoTmFtZTogc3RyaW5nLCBvcHRpb25zPzogQnVsa0ltcG9ydE9wdGlvbnMpOiBQcm9taXNlPEJ1bGtJbXBvcnRTZXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2Uuc3RhcnRCdWxrSW1wb3J0KGdyYXBoTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgQ2hlY2twb2ludCBpcyBubyBsb25nZXIgbmVlZGVkLiBVc2UgZW5kQnVsa0ltcG9ydCgpIHdoaWNoIHBlcmZvcm1zIGEgZmluYWwgZmx1c2guXG4gICAqL1xuICBhc3luYyBjaGVja3BvaW50KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxDaGVja3BvaW50UmVzdWx0PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICByZWNvcmRDb3VudDogMCxcbiAgICAgIGxhc3RDaGVja3BvaW50Q291bnQ6IDAsXG4gICAgICBtZXNzYWdlOiAnQ2hlY2twb2ludCBoYXMgYmVlbiByZW1vdmVkOyB1c2UgZW5kQnVsa0ltcG9ydCB3aGljaCBwZXJmb3JtcyBhIGZpbmFsIGZsdXNoJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgYnVsayBpbXBvcnQgc2Vzc2lvbiB3aXRoIGEgZmluYWwgY2hlY2twb2ludC5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBlbmRCdWxrSW1wb3J0KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxFbmRCdWxrSW1wb3J0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuZW5kQnVsa0ltcG9ydChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCB0aGUgYnVsayBpbXBvcnQgc2Vzc2lvbiB3aXRob3V0IGZpbmFsIHN5bmMuXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgYWJvcnRCdWxrSW1wb3J0KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxBYm9ydEJ1bGtJbXBvcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5hYm9ydEJ1bGtJbXBvcnQoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGEgYnVsayBpbXBvcnQgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBnZXRCdWxrSW1wb3J0U3RhdHVzKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxCdWxrSW1wb3J0U3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uICovXG4gIGdldFNlc3Npb24oKTogU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgc2Vzc2lvbiAqL1xuICBpc0xvZ2dlZEluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmlzTG9nZ2VkSW4oKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsaWVudCBjb25maWd1cmF0aW9uICovXG4gIGdldENvbmZpZygpOiBHcWxkYkNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRvIGEgY2x1c3RlciBkZXBsb3ltZW50ICovXG4gIGdldCBpc0NsdXN0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5pc0NsdXN0ZXIgfHwgZmFsc2U7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjbHVzdGVyIElEIChlbXB0eSBzdHJpbmcgaWYgbm90IGEgY2x1c3RlcikgKi9cbiAgZ2V0IGNsdXN0ZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8uY2x1c3RlcklkIHx8ICcnO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgcGFydGl0aW9uIGNvdW50ICgwIGlmIG5vdCBhIGNsdXN0ZXIpICovXG4gIGdldCBwYXJ0aXRpb25Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8ucGFydGl0aW9uQ291bnQgfHwgMDtcbiAgfVxufVxuIl19
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Configuration for GQLDB Node.js driver.
3
+ */
4
+ import * as tls from 'tls';
5
+ /** Configuration options for GqldbClient */
6
+ export interface GqldbConfig {
7
+ /** Server hosts in format "host:port" */
8
+ hosts: string[];
9
+ /** Username for authentication */
10
+ username?: string;
11
+ /** Password for authentication */
12
+ password?: string;
13
+ /** Default graph to use */
14
+ defaultGraph?: string;
15
+ /** Query timeout in milliseconds (default 30000ms = 30s) */
16
+ timeout?: number;
17
+ /** Maximum receive message size in bytes (default 64MB) */
18
+ maxRecvSize?: number;
19
+ /** TLS options for secure connections */
20
+ tlsOptions?: tls.ConnectionOptions;
21
+ /** Connection pool size per host */
22
+ poolSize?: number;
23
+ /** Health check interval in milliseconds (default 30000ms = 30s) */
24
+ healthCheckInterval?: number;
25
+ /** Number of retries for failed requests */
26
+ retryCount?: number;
27
+ /** Delay between retries in milliseconds (default 100ms) */
28
+ retryDelay?: number;
29
+ }
30
+ /** Default configuration values */
31
+ export declare const DEFAULT_CONFIG: Required<Omit<GqldbConfig, 'username' | 'password' | 'defaultGraph' | 'tlsOptions'>>;
32
+ /** Builder for creating GqldbConfig */
33
+ export declare class ConfigBuilder {
34
+ private config;
35
+ /** Set the server hosts */
36
+ hosts(...hosts: string[]): this;
37
+ /** Set the username for authentication */
38
+ username(username: string): this;
39
+ /** Set the password for authentication */
40
+ password(password: string): this;
41
+ /** Set the default graph */
42
+ defaultGraph(graph: string): this;
43
+ /** Set the query timeout in milliseconds */
44
+ timeout(ms: number): this;
45
+ /** Set the query timeout in seconds (convenience method) */
46
+ timeoutSeconds(seconds: number): this;
47
+ /** Set the maximum receive message size */
48
+ maxRecvSize(bytes: number): this;
49
+ /** Set TLS options */
50
+ tls(options: tls.ConnectionOptions): this;
51
+ /** Set the connection pool size per host */
52
+ poolSize(size: number): this;
53
+ /** Set the health check interval in milliseconds */
54
+ healthCheckInterval(ms: number): this;
55
+ /** Set the number of retries */
56
+ retryCount(count: number): this;
57
+ /** Set the delay between retries in milliseconds */
58
+ retryDelay(ms: number): this;
59
+ /** Build and return the configuration */
60
+ build(): GqldbConfig;
61
+ }
62
+ /** Validate the configuration */
63
+ export declare function validateConfig(config: GqldbConfig): void;
64
+ /** Create a configuration with defaults */
65
+ export declare function createConfig(options?: Partial<GqldbConfig>): GqldbConfig;