@ultipa-graph/ultipa-driver 5.1.5-s5.2 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/client.d.ts +194 -0
- package/dist/client.js +390 -0
- package/dist/config.d.ts +65 -0
- package/dist/config.js +135 -0
- package/dist/connection.d.ts +30 -0
- package/dist/connection.js +190 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.js +237 -0
- package/dist/index.d.ts +14 -5
- package/dist/index.js +88 -39
- package/dist/printers.d.ts +33 -0
- package/dist/printers.js +312 -0
- package/dist/proto/gqldb.proto +632 -0
- package/dist/response.d.ts +256 -0
- package/dist/response.js +723 -0
- package/dist/services/admin-service.d.ts +40 -0
- package/dist/services/admin-service.js +115 -0
- package/dist/services/bulk-import-service.d.ts +35 -0
- package/dist/services/bulk-import-service.js +108 -0
- package/dist/services/converters.d.ts +57 -0
- package/dist/services/converters.js +254 -0
- package/dist/services/data-service.d.ts +44 -0
- package/dist/services/data-service.js +206 -0
- package/dist/services/graph-service.d.ts +32 -0
- package/dist/services/graph-service.js +127 -0
- package/dist/services/health-service.d.ts +50 -0
- package/dist/services/health-service.js +78 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.js +30 -0
- package/dist/services/query-service.d.ts +39 -0
- package/dist/services/query-service.js +112 -0
- package/dist/services/service-context.d.ts +39 -0
- package/dist/services/service-context.js +73 -0
- package/dist/services/session-service.d.ts +24 -0
- package/dist/services/session-service.js +66 -0
- package/dist/services/transaction-service.d.ts +33 -0
- package/dist/services/transaction-service.js +100 -0
- package/dist/services.d.ts +28 -0
- package/dist/services.js +122 -0
- package/dist/session.d.ts +45 -0
- package/dist/session.js +75 -0
- package/dist/transaction.d.ts +42 -0
- package/dist/transaction.js +89 -0
- package/dist/types/bulk_import.d.ts +53 -0
- package/dist/types/bulk_import.js +6 -0
- package/dist/types/data_types.d.ts +116 -0
- package/dist/types/data_types.js +122 -0
- package/dist/types/enums.d.ts +59 -0
- package/dist/types/enums.js +67 -0
- package/dist/types/graph_models.d.ts +54 -0
- package/dist/types/graph_models.js +6 -0
- package/dist/types/index.d.ts +11 -5
- package/dist/types/index.js +36 -37
- package/dist/types/metadata.d.ts +60 -0
- package/dist/types/metadata.js +6 -0
- package/dist/types/schema.d.ts +31 -0
- package/dist/types/schema.js +6 -0
- package/dist/types/typed_value.d.ts +25 -0
- package/dist/types/typed_value.js +1176 -0
- package/dist/types/wrappers.d.ts +23 -0
- package/dist/types/wrappers.js +39 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +24 -0
- package/package.json +49 -62
- package/dist/connection/connection.final.d.ts +0 -14
- package/dist/connection/connection.final.js +0 -94
- package/dist/connection/connection.final.js.map +0 -1
- package/dist/connection/connection.pool.d.ts +0 -21
- package/dist/connection/connection.pool.js +0 -103
- package/dist/connection/connection.pool.js.map +0 -1
- package/dist/connection/extra/algos/algo.extra.d.ts +0 -34
- package/dist/connection/extra/algos/algo.extra.js +0 -69
- package/dist/connection/extra/algos/algo.extra.js.map +0 -1
- package/dist/connection/extra/algos/algo.utils.d.ts +0 -3
- package/dist/connection/extra/algos/algo.utils.js +0 -54
- package/dist/connection/extra/algos/algo.utils.js.map +0 -1
- package/dist/connection/extra/algos/community.d.ts +0 -27
- package/dist/connection/extra/algos/community.js +0 -76
- package/dist/connection/extra/algos/community.js.map +0 -1
- package/dist/connection/extra/algos/degrees.d.ts +0 -10
- package/dist/connection/extra/algos/degrees.js +0 -24
- package/dist/connection/extra/algos/degrees.js.map +0 -1
- package/dist/connection/extra/algos/embedding.d.ts +0 -13
- package/dist/connection/extra/algos/embedding.js +0 -33
- package/dist/connection/extra/algos/embedding.js.map +0 -1
- package/dist/connection/extra/algos/index.d.ts +0 -5
- package/dist/connection/extra/algos/index.js +0 -14
- package/dist/connection/extra/algos/index.js.map +0 -1
- package/dist/connection/extra/base.extra.d.ts +0 -18
- package/dist/connection/extra/base.extra.js +0 -111
- package/dist/connection/extra/base.extra.js.map +0 -1
- package/dist/connection/extra/batch.insert.extra.d.ts +0 -58
- package/dist/connection/extra/batch.insert.extra.js +0 -354
- package/dist/connection/extra/batch.insert.extra.js.map +0 -1
- package/dist/connection/extra/connection.base.d.ts +0 -112
- package/dist/connection/extra/connection.base.js +0 -530
- package/dist/connection/extra/connection.base.js.map +0 -1
- package/dist/connection/extra/connection.d.ts +0 -17
- package/dist/connection/extra/connection.js +0 -44
- package/dist/connection/extra/connection.js.map +0 -1
- package/dist/connection/extra/graph.extra.d.ts +0 -54
- package/dist/connection/extra/graph.extra.js +0 -151
- package/dist/connection/extra/graph.extra.js.map +0 -1
- package/dist/connection/extra/hdc.extra.d.ts +0 -89
- package/dist/connection/extra/hdc.extra.js +0 -322
- package/dist/connection/extra/hdc.extra.js.map +0 -1
- package/dist/connection/extra/index.extra.d.ts +0 -102
- package/dist/connection/extra/index.extra.js +0 -210
- package/dist/connection/extra/index.extra.js.map +0 -1
- package/dist/connection/extra/job.extra.d.ts +0 -32
- package/dist/connection/extra/job.extra.js +0 -122
- package/dist/connection/extra/job.extra.js.map +0 -1
- package/dist/connection/extra/meta.extra.d.ts +0 -36
- package/dist/connection/extra/meta.extra.js +0 -123
- package/dist/connection/extra/meta.extra.js.map +0 -1
- package/dist/connection/extra/policy.extra.d.ts +0 -32
- package/dist/connection/extra/policy.extra.js +0 -114
- package/dist/connection/extra/policy.extra.js.map +0 -1
- package/dist/connection/extra/privilege.extra.d.ts +0 -8
- package/dist/connection/extra/privilege.extra.js +0 -20
- package/dist/connection/extra/privilege.extra.js.map +0 -1
- package/dist/connection/extra/property.extra.d.ts +0 -66
- package/dist/connection/extra/property.extra.js +0 -190
- package/dist/connection/extra/property.extra.js.map +0 -1
- package/dist/connection/extra/schema.extra.d.ts +0 -108
- package/dist/connection/extra/schema.extra.js +0 -253
- package/dist/connection/extra/schema.extra.js.map +0 -1
- package/dist/connection/extra/search.extra.d.ts +0 -12
- package/dist/connection/extra/search.extra.js +0 -117
- package/dist/connection/extra/search.extra.js.map +0 -1
- package/dist/connection/extra/task.extra.d.ts +0 -24
- package/dist/connection/extra/task.extra.js +0 -107
- package/dist/connection/extra/task.extra.js.map +0 -1
- package/dist/connection/extra/user.extra.d.ts +0 -28
- package/dist/connection/extra/user.extra.js +0 -91
- package/dist/connection/extra/user.extra.js.map +0 -1
- package/dist/connection/extra/user.privilege.extra.d.ts +0 -64
- package/dist/connection/extra/user.privilege.extra.js +0 -273
- package/dist/connection/extra/user.privilege.extra.js.map +0 -1
- package/dist/connection/index.d.ts +0 -5
- package/dist/connection/index.js +0 -13
- package/dist/connection/index.js.map +0 -1
- package/dist/connection/network.manager.d.ts +0 -28
- package/dist/connection/network.manager.js +0 -179
- package/dist/connection/network.manager.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/printers/alias.d.ts +0 -2
- package/dist/printers/alias.js +0 -39
- package/dist/printers/alias.js.map +0 -1
- package/dist/printers/any.d.ts +0 -2
- package/dist/printers/any.js +0 -63
- package/dist/printers/any.js.map +0 -1
- package/dist/printers/array.aio.d.ts +0 -3
- package/dist/printers/array.aio.js +0 -259
- package/dist/printers/array.aio.js.map +0 -1
- package/dist/printers/common.d.ts +0 -0
- package/dist/printers/common.js +0 -1
- package/dist/printers/common.js.map +0 -1
- package/dist/printers/edge.d.ts +0 -5
- package/dist/printers/edge.js +0 -78
- package/dist/printers/edge.js.map +0 -1
- package/dist/printers/explain.plan.d.ts +0 -2
- package/dist/printers/explain.plan.js +0 -46
- package/dist/printers/explain.plan.js.map +0 -1
- package/dist/printers/index.d.ts +0 -24
- package/dist/printers/index.js +0 -43
- package/dist/printers/index.js.map +0 -1
- package/dist/printers/node.d.ts +0 -5
- package/dist/printers/node.js +0 -77
- package/dist/printers/node.js.map +0 -1
- package/dist/printers/path.d.ts +0 -3
- package/dist/printers/path.js +0 -62
- package/dist/printers/path.js.map +0 -1
- package/dist/printers/status.d.ts +0 -3
- package/dist/printers/status.js +0 -68
- package/dist/printers/status.js.map +0 -1
- package/dist/printers/table.d.ts +0 -2
- package/dist/printers/table.js +0 -56
- package/dist/printers/table.js.map +0 -1
- package/dist/proto/tmp.js +0 -366
- package/dist/proto/ultipa_grpc_pb.d.ts +0 -258
- package/dist/proto/ultipa_grpc_pb.js +0 -366
- package/dist/proto/ultipa_grpc_pb.js.map +0 -1
- package/dist/proto/ultipa_pb.d.ts +0 -1
- package/dist/proto/ultipa_pb.js +0 -12119
- package/dist/proto/ultipa_pb.js.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/types.algos.params.d.ts +0 -545
- package/dist/types/types.algos.params.js +0 -16
- package/dist/types/types.algos.params.js.map +0 -1
- package/dist/types/types.d.ts +0 -1214
- package/dist/types/types.extra.d.ts +0 -146
- package/dist/types/types.extra.js +0 -27
- package/dist/types/types.extra.js.map +0 -1
- package/dist/types/types.js +0 -1606
- package/dist/types/types.js.map +0 -1
- package/dist/types/util.d.ts +0 -15
- package/dist/types/util.js +0 -136
- package/dist/types/util.js.map +0 -1
- package/dist/utils/common.d.ts +0 -3
- package/dist/utils/common.js +0 -22
- package/dist/utils/common.js.map +0 -1
- package/dist/utils/config.d.ts +0 -3
- package/dist/utils/config.js +0 -7
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/format.d.ts +0 -45
- package/dist/utils/format.js +0 -879
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/index.d.ts +0 -10
- package/dist/utils/index.js +0 -30
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/params.validate.d.ts +0 -4
- package/dist/utils/params.validate.js +0 -14
- package/dist/utils/params.validate.js.map +0 -1
- package/dist/utils/property.d.ts +0 -24
- package/dist/utils/property.js +0 -203
- package/dist/utils/property.js.map +0 -1
- package/dist/utils/raft.retry.d.ts +0 -0
- package/dist/utils/raft.retry.js +0 -1
- package/dist/utils/raft.retry.js.map +0 -1
- package/dist/utils/serialize/commont.d.ts +0 -12
- package/dist/utils/serialize/commont.js +0 -46
- package/dist/utils/serialize/commont.js.map +0 -1
- package/dist/utils/serialize/deserialize.d.ts +0 -10
- package/dist/utils/serialize/deserialize.js +0 -288
- package/dist/utils/serialize/deserialize.js.map +0 -1
- package/dist/utils/serialize/null.d.ts +0 -32
- package/dist/utils/serialize/null.js +0 -178
- package/dist/utils/serialize/null.js.map +0 -1
- package/dist/utils/serialize/serialize.d.ts +0 -10
- package/dist/utils/serialize/serialize.js +0 -146
- package/dist/utils/serialize/serialize.js.map +0 -1
- package/dist/utils/stream.helper.d.ts +0 -10
- package/dist/utils/stream.helper.js +0 -71
- package/dist/utils/stream.helper.js.map +0 -1
- package/dist/utils/time.record.d.ts +0 -15
- package/dist/utils/time.record.js +0 -52
- package/dist/utils/time.record.js.map +0 -1
- package/dist/utils/timezone.d.ts +0 -7
- package/dist/utils/timezone.js +0 -21
- package/dist/utils/timezone.js.map +0 -1
- package/dist/utils/ultipa.datetime.d.ts +0 -14
- package/dist/utils/ultipa.datetime.js +0 -160
- package/dist/utils/ultipa.datetime.js.map +0 -1
- package/dist/utils/uql-maker.d.ts +0 -165
- package/dist/utils/uql-maker.js +0 -402
- package/dist/utils/uql-maker.js.map +0 -1
- package/dist/utils/uql.parse.d.ts +0 -27
- package/dist/utils/uql.parse.js +0 -205
- package/dist/utils/uql.parse.js.map +0 -1
- package/readme.md +0 -65
- package/src/proto/build.sh +0 -41
- package/src/proto/build_windows.sh +0 -40
- package/src/proto/ultipa.proto +0 -531
- package/src/proto/ultipa_grpc_pb.d.ts +0 -92
- package/src/proto/ultipa_grpc_pb.js +0 -414
- package/src/proto/ultipa_pb.d.ts +0 -1983
- package/src/proto/ultipa_pb.js +0 -14852
package/dist/client.js
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
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
|
+
/** Trigger manual compaction of the database storage */
|
|
311
|
+
async compact() {
|
|
312
|
+
return this.adminService.compact();
|
|
313
|
+
}
|
|
314
|
+
/** Wait for the computing engine topology to be ready */
|
|
315
|
+
async waitForComputeTopology(graphName, timeoutMs = 0) {
|
|
316
|
+
return this.adminService.waitForComputeTopology(graphName, timeoutMs);
|
|
317
|
+
}
|
|
318
|
+
// ===========================================================================
|
|
319
|
+
// Bulk Import Service
|
|
320
|
+
// ===========================================================================
|
|
321
|
+
/**
|
|
322
|
+
* Start a bulk import session for optimized high-throughput inserts.
|
|
323
|
+
* @param graphName Target graph name
|
|
324
|
+
* @param options Optional bulk import configuration
|
|
325
|
+
*/
|
|
326
|
+
async startBulkImport(graphName, options) {
|
|
327
|
+
return this.bulkImportService.startBulkImport(graphName, options);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* @deprecated Checkpoint is no longer needed. Use endBulkImport() which performs a final flush.
|
|
331
|
+
*/
|
|
332
|
+
async checkpoint(sessionId) {
|
|
333
|
+
return {
|
|
334
|
+
success: true,
|
|
335
|
+
recordCount: 0,
|
|
336
|
+
lastCheckpointCount: 0,
|
|
337
|
+
message: 'Checkpoint has been removed; use endBulkImport which performs a final flush',
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* End the bulk import session with a final checkpoint.
|
|
342
|
+
* @param sessionId Bulk import session ID
|
|
343
|
+
*/
|
|
344
|
+
async endBulkImport(sessionId) {
|
|
345
|
+
return this.bulkImportService.endBulkImport(sessionId);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Cancel the bulk import session without final sync.
|
|
349
|
+
* @param sessionId Bulk import session ID
|
|
350
|
+
*/
|
|
351
|
+
async abortBulkImport(sessionId) {
|
|
352
|
+
return this.bulkImportService.abortBulkImport(sessionId);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Return the current status of a bulk import session.
|
|
356
|
+
* @param sessionId Bulk import session ID
|
|
357
|
+
*/
|
|
358
|
+
async getBulkImportStatus(sessionId) {
|
|
359
|
+
return this.bulkImportService.getBulkImportStatus(sessionId);
|
|
360
|
+
}
|
|
361
|
+
// ===========================================================================
|
|
362
|
+
// Convenience Methods
|
|
363
|
+
// ===========================================================================
|
|
364
|
+
/** Get the current session */
|
|
365
|
+
getSession() {
|
|
366
|
+
return this.sessions.getSession();
|
|
367
|
+
}
|
|
368
|
+
/** Check if there is an active session */
|
|
369
|
+
isLoggedIn() {
|
|
370
|
+
return this.sessions.isLoggedIn();
|
|
371
|
+
}
|
|
372
|
+
/** Get the client configuration */
|
|
373
|
+
getConfig() {
|
|
374
|
+
return this.config;
|
|
375
|
+
}
|
|
376
|
+
/** Whether this client is connected to a cluster deployment */
|
|
377
|
+
get isCluster() {
|
|
378
|
+
return this.sessions.getSession()?.isCluster || false;
|
|
379
|
+
}
|
|
380
|
+
/** Get the cluster ID (empty string if not a cluster) */
|
|
381
|
+
get clusterId() {
|
|
382
|
+
return this.sessions.getSession()?.clusterId || '';
|
|
383
|
+
}
|
|
384
|
+
/** Get the partition count (0 if not a cluster) */
|
|
385
|
+
get partitionCount() {
|
|
386
|
+
return this.sessions.getSession()?.partitionCount || 0;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
exports.GqldbClient = GqldbClient;
|
|
390
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFjdkQsdUNBQW9EO0FBQ3BELCtDQUFnRTtBQUNoRSxtQ0FvQmlCO0FBQ2pCLHlDQUE0RjtBQUM1Riw0Q0FXMEI7QUFrQzFCLDZDQUE2QztBQUM3QyxNQUFhLFdBQVc7SUFDZCxNQUFNLENBQWM7SUFDcEIsT0FBTyxDQUFpQjtJQUN4QixRQUFRLENBQWlCO0lBQ3pCLFNBQVMsQ0FBcUI7SUFDOUIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV2QixvQkFBb0I7SUFDWixjQUFjLENBQWlCO0lBQy9CLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0Isa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUN6QixhQUFhLENBQWdCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixpQkFBaUIsQ0FBb0I7SUFFN0Msc0RBQXNEO0lBQzlDLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7UUFDM0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFlBQVksTUFBbUI7UUFDN0IsSUFBQSx1QkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSx3QkFBYyxFQUFFLENBQUM7UUFD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QVMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsU0FBaUI7UUFDekMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxzQkFBc0I7SUFDdEIsOEVBQThFO0lBRTlFLDhCQUE4QjtJQUM5QixVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxJQUFJLEtBQUssQ0FBQztJQUN4RCxDQUFDO0lBRUQseURBQXlEO0lBQ3pELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxjQUFjLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQS9iRCxrQ0ErYkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogTWFpbiBjbGllbnQgZm9yIEdRTERCIE5vZGUuanMgZHJpdmVyLlxyXG4gKi9cclxuXHJcbmltcG9ydCAqIGFzIGdycGMgZnJvbSAnQGdycGMvZ3JwYy1qcyc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCB7IEdxbGRiQ29uZmlnLCB2YWxpZGF0ZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgRW1wdHlRdWVyeUVycm9yLCBMb2dpbkZhaWxlZEVycm9yLCBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xyXG5pbXBvcnQge1xyXG4gIFJlc3BvbnNlLFxyXG4gIFJvdyxcclxuICBJbnNlcnROb2Rlc1Jlc3VsdCxcclxuICBJbnNlcnRFZGdlc1Jlc3VsdCxcclxuICBEZWxldGVSZXN1bHQsXHJcbiAgRXhwb3J0Tm9kZXNSZXN1bHQsXHJcbiAgRXhwb3J0RWRnZXNSZXN1bHQsXHJcbiAgRXhwb3J0Q29uZmlnLFxyXG4gIEV4cG9ydENodW5rLFxyXG4gIEV4cG9ydFN0YXRzLFxyXG59IGZyb20gJy4vcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJy4vc2Vzc2lvbic7XHJcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbk1hbmFnZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcclxuaW1wb3J0IHtcclxuICBHcmFwaEluZm8sXHJcbiAgR3JhcGhUeXBlLFxyXG4gIEhlYWx0aFN0YXR1cyxcclxuICBDYWNoZVN0YXRzLFxyXG4gIENhY2hlVHlwZSxcclxuICBTdGF0aXN0aWNzLFxyXG4gIENvbXBhY3RSZXN1bHQsXHJcbiAgQ29tcHV0ZVRvcG9sb2d5UmVzdWx0LFxyXG4gIE5vZGVEYXRhLFxyXG4gIEVkZ2VEYXRhLFxyXG4gIEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnMsXHJcbiAgQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucyxcclxuICBCdWxrSW1wb3J0T3B0aW9ucyxcclxuICBCdWxrSW1wb3J0U2Vzc2lvbixcclxuICBDaGVja3BvaW50UmVzdWx0LFxyXG4gIEVuZEJ1bGtJbXBvcnRSZXN1bHQsXHJcbiAgQWJvcnRCdWxrSW1wb3J0UmVzdWx0LFxyXG4gIEJ1bGtJbXBvcnRTdGF0dXMsXHJcbiAgVHJhbnNhY3Rpb25JbmZvLFxyXG59IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBjcmVhdGVTZXJ2aWNlQ2xpZW50cywgcHJvbWlzaWZ5Q2FsbCwgcHJvbWlzaWZ5Q2FsbFdpdGhEZWFkbGluZSB9IGZyb20gJy4vc2VydmljZXMnO1xyXG5pbXBvcnQge1xyXG4gIFNlcnZpY2VDb250ZXh0LFxyXG4gIFNlcnZpY2VDbGllbnRzLFxyXG4gIFNlc3Npb25TZXJ2aWNlLFxyXG4gIFF1ZXJ5U2VydmljZSxcclxuICBHcmFwaFNlcnZpY2UsXHJcbiAgVHJhbnNhY3Rpb25TZXJ2aWNlLFxyXG4gIERhdGFTZXJ2aWNlLFxyXG4gIEhlYWx0aFNlcnZpY2UsXHJcbiAgQWRtaW5TZXJ2aWNlLFxyXG4gIEJ1bGtJbXBvcnRTZXJ2aWNlLFxyXG59IGZyb20gJy4vc2VydmljZXMvaW5kZXgnO1xyXG5cclxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGEgcXVlcnkgKi9cclxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNvbmZpZyB7XHJcbiAgZ3JhcGhOYW1lPzogc3RyaW5nO1xyXG4gIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gIHRyYW5zYWN0aW9uSWQ/OiBudW1iZXI7XHJcbiAgdGltZW91dD86IG51bWJlcjtcclxuICByZWFkT25seT86IGJvb2xlYW47XHJcbiAgLyoqIE1heCBwYXRocyB0byByZXR1cm4gZnJvbSBwYXRoIHF1ZXJpZXMgKDAgPSB1bmxpbWl0ZWQpICovXHJcbiAgbWF4UGF0aFJlc3VsdHM/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgbm9kZXMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBJbnNlcnROb2Rlc0NvbmZpZyB7XHJcbiAgb3B0aW9ucz86IEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnM7XHJcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcclxufVxyXG5cclxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydCBlZGdlcyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydEVkZ2VzQ29uZmlnIHtcclxuICBvcHRpb25zPzogQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucztcclxuICBidWxrSW1wb3J0U2Vzc2lvbklkPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogSGVhbHRoIHdhdGNoZXIgaW50ZXJmYWNlIGZvciBzdHJlYW1pbmcgaGVhbHRoIHVwZGF0ZXMuXHJcbiAqIEVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyBhbmQgJ2Vycm9yJyBldmVudHMgb24gZmFpbHVyZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoV2F0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgLyoqIFN0b3Agd2F0Y2hpbmcgaGVhbHRoIHVwZGF0ZXMgKi9cclxuICBzdG9wKCk6IHZvaWQ7XHJcbn1cclxuXHJcbi8qKiBNYWluIGNsaWVudCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBHUUxEQiAqL1xyXG5leHBvcnQgY2xhc3MgR3FsZGJDbGllbnQge1xyXG4gIHByaXZhdGUgY29uZmlnOiBHcWxkYkNvbmZpZztcclxuICBwcml2YXRlIGNsaWVudHM6IFNlcnZpY2VDbGllbnRzO1xyXG4gIHByaXZhdGUgc2Vzc2lvbnM6IFNlc3Npb25NYW5hZ2VyO1xyXG4gIHByaXZhdGUgdHhNYW5hZ2VyOiBUcmFuc2FjdGlvbk1hbmFnZXI7XHJcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8gU2VydmljZSBpbnN0YW5jZXNcclxuICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZTtcclxuICBwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlO1xyXG4gIHByaXZhdGUgZ3JhcGhTZXJ2aWNlOiBHcmFwaFNlcnZpY2U7XHJcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvblNlcnZpY2U6IFRyYW5zYWN0aW9uU2VydmljZTtcclxuICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcclxuICBwcml2YXRlIGhlYWx0aFNlcnZpY2U6IEhlYWx0aFNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZTtcclxuICBwcml2YXRlIGJ1bGtJbXBvcnRTZXJ2aWNlOiBCdWxrSW1wb3J0U2VydmljZTtcclxuXHJcbiAgLyoqIEdldCBzZXNzaW9uIG1ldGFkYXRhIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzICovXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uTWV0YWRhdGEoKTogZ3JwYy5NZXRhZGF0YSB7XHJcbiAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBncnBjLk1ldGFkYXRhKCk7XHJcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XHJcbiAgICBtZXRhZGF0YS5hZGQoJ3Nlc3Npb24taWQnLCBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcpO1xyXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBHcWxkYkNvbmZpZykge1xyXG4gICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcclxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gICAgdGhpcy5zZXNzaW9ucyA9IG5ldyBTZXNzaW9uTWFuYWdlcigpO1xyXG4gICAgdGhpcy50eE1hbmFnZXIgPSBuZXcgVHJhbnNhY3Rpb25NYW5hZ2VyKCk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGdSUEMgY3JlZGVudGlhbHNcclxuICAgIGxldCBjcmVkZW50aWFsczogZ3JwYy5DaGFubmVsQ3JlZGVudGlhbHM7XHJcbiAgICBpZiAoY29uZmlnLnRsc09wdGlvbnMpIHtcclxuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUluc2VjdXJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hhbm5lbCBvcHRpb25zXHJcbiAgICBjb25zdCBvcHRpb25zOiBncnBjLkNoYW5uZWxPcHRpb25zID0ge1xyXG4gICAgICAnZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aCc6IGNvbmZpZy5tYXhSZWN2U2l6ZSA/PyA0ICogMTAyNCAqIDEwMjQsXHJcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lX21zJzogMzAwMDAsXHJcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lb3V0X21zJzogMTAwMDAsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBzZXJ2aWNlIGNsaWVudHMgZm9yIHRoZSBmaXJzdCBob3N0XHJcbiAgICBjb25zdCBob3N0ID0gY29uZmlnLmhvc3RzWzBdO1xyXG4gICAgdGhpcy5jbGllbnRzID0gY3JlYXRlU2VydmljZUNsaWVudHMoaG9zdCwgY3JlZGVudGlhbHMsIG9wdGlvbnMpO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBjb250ZXh0XHJcbiAgICBjb25zdCBjdHggPSBuZXcgU2VydmljZUNvbnRleHQodGhpcy5jb25maWcsIHRoaXMuc2Vzc2lvbnMsIHRoaXMudHhNYW5hZ2VyLCB0aGlzLmNsaWVudHMpO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcclxuICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UgPSBuZXcgU2Vzc2lvblNlcnZpY2UoY3R4KTtcclxuICAgIHRoaXMucXVlcnlTZXJ2aWNlID0gbmV3IFF1ZXJ5U2VydmljZShjdHgpO1xyXG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uU2VydmljZSA9IG5ldyBUcmFuc2FjdGlvblNlcnZpY2UoY3R4KTtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UgPSBuZXcgRGF0YVNlcnZpY2UoY3R4KTtcclxuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XHJcbiAgICB0aGlzLmFkbWluU2VydmljZSA9IG5ldyBBZG1pblNlcnZpY2UoY3R4KTtcclxuICAgIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UgPSBuZXcgQnVsa0ltcG9ydFNlcnZpY2UoY3R4KTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9zZSB0aGUgY2xpZW50IGFuZCBhbGwgY29ubmVjdGlvbnMgKi9cclxuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLnNlc3Npb25zLmlzTG9nZ2VkSW4oKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBJZ25vcmUgbG9nb3V0IGVycm9ycyBkdXJpbmcgY2xvc2VcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcclxuICAgIHRyeSB7XHJcbiAgICAgICh0aGlzLmNsaWVudHMuc2Vzc2lvblNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xyXG4gICAgICAodGhpcy5jbGllbnRzLmdyYXBoU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcclxuICAgICAgKHRoaXMuY2xpZW50cy50cmFuc2FjdGlvblNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICAgICh0aGlzLmNsaWVudHMuaGVhbHRoU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcclxuICAgICAgKHRoaXMuY2xpZW50cy5hZG1pblNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIElnbm9yZSBjbG9zZSBlcnJvcnNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIFNlc3Npb24gU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogQXV0aGVudGljYXRlIHRoZSB1c2VyIGFuZCBjcmVhdGUgYSBzZXNzaW9uICovXHJcbiAgYXN5bmMgbG9naW4odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBzZXNzaW9uICovXHJcbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UubG9nb3V0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hlY2sgdGhlIGNvbm5lY3Rpb24gYW5kIHJldHVybiB0aGUgbGF0ZW5jeSBpbiBuYW5vc2Vjb25kcyAqL1xyXG4gIGFzeW5jIHBpbmcoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLnBpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIFF1ZXJ5IFNlcnZpY2VcclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLyoqIEV4ZWN1dGUgYSBHUUwgcXVlcnkgYW5kIHJldHVybiB0aGUgcmVzdWx0ICovXHJcbiAgYXN5bmMgZ3FsKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZXJ2aWNlLmdxbChxdWVyeSwgY29uZmlnKTtcclxuICB9XHJcblxyXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCBzdHJlYW0gdGhlIHJlc3VsdHMgKi9cclxuICBhc3luYyBncWxTdHJlYW0oXHJcbiAgICBxdWVyeTogc3RyaW5nLFxyXG4gICAgY29uZmlnPzogUXVlcnlDb25maWcsXHJcbiAgICBjYWxsYmFjaz86IChyZXNwb25zZTogUmVzcG9uc2UpID0+IHZvaWRcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5ncWxTdHJlYW0ocXVlcnksIGNvbmZpZywgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybiB0aGUgZXhlY3V0aW9uIHBsYW4gZm9yIGEgcXVlcnkgKi9cclxuICBhc3luYyBleHBsYWluKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5leHBsYWluKHF1ZXJ5LCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV4ZWN1dGUgYSBxdWVyeSB3aXRoIHByb2ZpbGluZyBhbmQgcmV0dXJuIHN0YXRpc3RpY3MgKi9cclxuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5wcm9maWxlKHF1ZXJ5LCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gR3JhcGggU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogQ3JlYXRlIGEgbmV3IGdyYXBoICovXHJcbiAgYXN5bmMgY3JlYXRlR3JhcGgoXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuY3JlYXRlR3JhcGgobmFtZSwgZ3JhcGhUeXBlLCBkZXNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKiogRGVsZXRlIGEgZ3JhcGggKi9cclxuICBhc3luYyBkcm9wR3JhcGgobmFtZTogc3RyaW5nLCBpZkV4aXN0czogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZHJvcEdyYXBoKG5hbWUsIGlmRXhpc3RzKTtcclxuICB9XHJcblxyXG4gIC8qKiBTZXQgdGhlIGN1cnJlbnQgZ3JhcGggZm9yIHRoZSBzZXNzaW9uICovXHJcbiAgYXN5bmMgdXNlR3JhcGgobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UudXNlR3JhcGgobmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGFsbCBhdmFpbGFibGUgZ3JhcGhzICovXHJcbiAgYXN5bmMgbGlzdEdyYXBocygpOiBQcm9taXNlPEdyYXBoSW5mb1tdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UubGlzdEdyYXBocygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGdyYXBoICovXHJcbiAgYXN5bmMgZ2V0R3JhcGhJbmZvKG5hbWU6IHN0cmluZyk6IFByb21pc2U8R3JhcGhJbmZvPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZ2V0R3JhcGhJbmZvKG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gVHJhbnNhY3Rpb24gU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gKi9cclxuICBhc3luYyBiZWdpblRyYW5zYWN0aW9uKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgdGltZW91dDogbnVtYmVyID0gMFxyXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5iZWdpblRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgcmVhZE9ubHksIHRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbW1pdCBhIHRyYW5zYWN0aW9uICovXHJcbiAgYXN5bmMgY29tbWl0KHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmNvbW1pdCh0cmFuc2FjdGlvbklkKTtcclxuICB9XHJcblxyXG4gIC8qKiBSb2xsYmFjayBhIHRyYW5zYWN0aW9uICovXHJcbiAgYXN5bmMgcm9sbGJhY2sodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uucm9sbGJhY2sodHJhbnNhY3Rpb25JZCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi9cclxuICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvW10+IHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5saXN0VHJhbnNhY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKiogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGhpbiBhIHRyYW5zYWN0aW9uICovXHJcbiAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBmbjogKHR4SWQ6IG51bWJlcikgPT4gUHJvbWlzZTxUPixcclxuICAgIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2VcclxuICApOiBQcm9taXNlPFQ+IHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS53aXRoVHJhbnNhY3Rpb24oZ3JhcGhOYW1lLCBmbiwgcmVhZE9ubHkpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gRGF0YSBTZXJ2aWNlXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgbm9kZXMgaW50byBhIGdyYXBoICovXHJcbiAgYXN5bmMgaW5zZXJ0Tm9kZXMoXHJcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcclxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxyXG4gICAgY29uZmlnPzogSW5zZXJ0Tm9kZXNDb25maWdcclxuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnROb2RlcyhncmFwaE5hbWUsIG5vZGVzLCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluc2VydCBtdWx0aXBsZSBlZGdlcyBpbnRvIGEgZ3JhcGggKi9cclxuICBhc3luYyBpbnNlcnRFZGdlcyhcclxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxyXG4gICAgZWRnZXM6IEVkZ2VEYXRhW10sXHJcbiAgICBjb25maWc/OiBJbnNlcnRFZGdlc0NvbmZpZ1xyXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydEVkZ2VzKGdyYXBoTmFtZSwgZWRnZXMsIGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKiogRGVsZXRlIG5vZGVzIGZyb20gYSBncmFwaCAqL1xyXG4gIGFzeW5jIGRlbGV0ZU5vZGVzKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBub2RlSWRzPzogc3RyaW5nW10sXHJcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcclxuICAgIHdoZXJlPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZU5vZGVzKGdyYXBoTmFtZSwgbm9kZUlkcywgbGFiZWxzLCB3aGVyZSk7XHJcbiAgfVxyXG5cclxuICAvKiogRGVsZXRlIGVkZ2VzIGZyb20gYSBncmFwaCAqL1xyXG4gIGFzeW5jIGRlbGV0ZUVkZ2VzKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBlZGdlSWRzPzogc3RyaW5nW10sXHJcbiAgICBsYWJlbD86IHN0cmluZyxcclxuICAgIHdoZXJlPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZUVkZ2VzKGdyYXBoTmFtZSwgZWRnZUlkcywgbGFiZWwsIHdoZXJlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCBncmFwaCBkYXRhIGluIEpTT04gTGluZXMgZm9ybWF0IChzdHJlYW1pbmcpLlxyXG4gICAqIEBwYXJhbSBjb25maWcgRXhwb3J0IGNvbmZpZ3VyYXRpb25cclxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZm9yIGVhY2ggZXhwb3J0ZWQgY2h1bmtcclxuICAgKi9cclxuICBhc3luYyBleHBvcnQoXHJcbiAgICBjb25maWc6IEV4cG9ydENvbmZpZyxcclxuICAgIGNhbGxiYWNrPzogKGNodW5rOiBFeHBvcnRDaHVuaykgPT4gdm9pZFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0KGNvbmZpZywgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RyZWFtIG5vZGVzIGZyb20gYSBncmFwaFxyXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXHJcbiAgICovXHJcbiAgYXN5bmMgZXhwb3J0Tm9kZXMoXHJcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcclxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxyXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXHJcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydE5vZGVzUmVzdWx0KSA9PiB2b2lkXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnROb2RlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0cmVhbSBlZGdlcyBmcm9tIGEgZ3JhcGhcclxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxyXG4gICAqL1xyXG4gIGFzeW5jIGV4cG9ydEVkZ2VzKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcclxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxyXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnRFZGdlc1Jlc3VsdCkgPT4gdm9pZFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0RWRnZXMoZ3JhcGhOYW1lLCBsYWJlbHMsIGxpbWl0LCBjYWxsYmFjayk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBIZWFsdGggU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogQ2hlY2sgdGhlIGhlYWx0aCBvZiBhIHNlcnZpY2UgKi9cclxuICBhc3luYyBoZWFsdGhDaGVjayhzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8SGVhbHRoU3RhdHVzPiB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLmhlYWx0aENoZWNrKHNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggaGVhbHRoIHN0YXR1cyBjaGFuZ2VzIHZpYSBzZXJ2ZXItc2lkZSBzdHJlYW1pbmcuXHJcbiAgICogUmV0dXJucyBhIEhlYWx0aFdhdGNoZXIgdGhhdCBlbWl0cyAnc3RhdHVzJyBldmVudHMgd2l0aCBIZWFsdGhTdGF0dXMgdmFsdWVzLlxyXG4gICAqIENhbGwgc3RvcCgpIHRvIGNhbmNlbCB0aGUgc3RyZWFtLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNlcnZpY2UgLSBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gd2F0Y2hcclxuICAgKiBAcmV0dXJucyBIZWFsdGhXYXRjaGVyIC0gRXZlbnRFbWl0dGVyIHdpdGggc3RvcCgpIG1ldGhvZFxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogY29uc3Qgd2F0Y2hlciA9IGNsaWVudC53YXRjaCgpO1xyXG4gICAqIHdhdGNoZXIub24oJ3N0YXR1cycsIChzdGF0dXM6IEhlYWx0aFN0YXR1cykgPT4ge1xyXG4gICAqICAgY29uc29sZS5sb2coJ0hlYWx0aCBzdGF0dXM6Jywgc3RhdHVzKTtcclxuICAgKiB9KTtcclxuICAgKiB3YXRjaGVyLm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgKiAgIGNvbnNvbGUuZXJyb3IoJ1dhdGNoIGVycm9yOicsIGVycik7XHJcbiAgICogfSk7XHJcbiAgICogd2F0Y2hlci5vbignZW5kJywgKCkgPT4ge1xyXG4gICAqICAgY29uc29sZS5sb2coJ1dhdGNoIHN0cmVhbSBlbmRlZCcpO1xyXG4gICAqIH0pO1xyXG4gICAqIC8vIExhdGVyLCB0byBzdG9wIHdhdGNoaW5nOlxyXG4gICAqIHdhdGNoZXIuc3RvcCgpO1xyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIHdhdGNoKHNlcnZpY2U6IHN0cmluZyA9ICcnKTogSGVhbHRoV2F0Y2hlciB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLndhdGNoKHNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gQWRtaW4gU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogUHJlLWFsbG9jYXRlIHBhcnNlciBpbnN0YW5jZXMgKi9cclxuICBhc3luYyB3YXJtdXBQYXJzZXIoY291bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhcm11cFBhcnNlcihjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGNhY2hlIHN0YXRpc3RpY3MgKi9cclxuICBhc3luYyBnZXRDYWNoZVN0YXRzKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8Q2FjaGVTdGF0cz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldENhY2hlU3RhdHMoY2FjaGVUeXBlKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhciB0aGUgc3BlY2lmaWVkIGNhY2hlICovXHJcbiAgYXN5bmMgY2xlYXJDYWNoZShjYWNoZVR5cGU6IENhY2hlVHlwZSA9IENhY2hlVHlwZS5BTEwpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jbGVhckNhY2hlKGNhY2hlVHlwZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGRhdGFiYXNlIHN0YXRpc3RpY3MgKi9cclxuICBhc3luYyBnZXRTdGF0aXN0aWNzKGdyYXBoTmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPFN0YXRpc3RpY3M+IHtcclxuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRTdGF0aXN0aWNzKGdyYXBoTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKiogSW52YWxpZGF0ZSB0aGUgUkJBQyBwZXJtaXNzaW9uIGNhY2hlICovXHJcbiAgYXN5bmMgaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5pbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcmlnZ2VyIG1hbnVhbCBjb21wYWN0aW9uIG9mIHRoZSBkYXRhYmFzZSBzdG9yYWdlICovXHJcbiAgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPENvbXBhY3RSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jb21wYWN0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogV2FpdCBmb3IgdGhlIGNvbXB1dGluZyBlbmdpbmUgdG9wb2xvZ3kgdG8gYmUgcmVhZHkgKi9cclxuICBhc3luYyB3YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IDApOiBQcm9taXNlPENvbXB1dGVUb3BvbG9neVJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhaXRGb3JDb21wdXRlVG9wb2xvZ3koZ3JhcGhOYW1lLCB0aW1lb3V0TXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gQnVsayBJbXBvcnQgU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKipcclxuICAgKiBTdGFydCBhIGJ1bGsgaW1wb3J0IHNlc3Npb24gZm9yIG9wdGltaXplZCBoaWdoLXRocm91Z2hwdXQgaW5zZXJ0cy5cclxuICAgKiBAcGFyYW0gZ3JhcGhOYW1lIFRhcmdldCBncmFwaCBuYW1lXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgYnVsayBpbXBvcnQgY29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIHN0YXJ0QnVsa0ltcG9ydChncmFwaE5hbWU6IHN0cmluZywgb3B0aW9ucz86IEJ1bGtJbXBvcnRPcHRpb25zKTogUHJvbWlzZTxCdWxrSW1wb3J0U2Vzc2lvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2Uuc3RhcnRCdWxrSW1wb3J0KGdyYXBoTmFtZSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBDaGVja3BvaW50IGlzIG5vIGxvbmdlciBuZWVkZWQuIFVzZSBlbmRCdWxrSW1wb3J0KCkgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaC5cclxuICAgKi9cclxuICBhc3luYyBjaGVja3BvaW50KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxDaGVja3BvaW50UmVzdWx0PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICByZWNvcmRDb3VudDogMCxcclxuICAgICAgbGFzdENoZWNrcG9pbnRDb3VudDogMCxcclxuICAgICAgbWVzc2FnZTogJ0NoZWNrcG9pbnQgaGFzIGJlZW4gcmVtb3ZlZDsgdXNlIGVuZEJ1bGtJbXBvcnQgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaCcsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5kIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGggYSBmaW5hbCBjaGVja3BvaW50LlxyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxyXG4gICAqL1xyXG4gIGFzeW5jIGVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEVuZEJ1bGtJbXBvcnRSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbmNlbCB0aGUgYnVsayBpbXBvcnQgc2Vzc2lvbiB3aXRob3V0IGZpbmFsIHN5bmMuXHJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXHJcbiAgICovXHJcbiAgYXN5bmMgYWJvcnRCdWxrSW1wb3J0KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxBYm9ydEJ1bGtJbXBvcnRSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBhIGJ1bGsgaW1wb3J0IHNlc3Npb24uXHJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8QnVsa0ltcG9ydFN0YXR1cz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gQ29udmVuaWVuY2UgTWV0aG9kc1xyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogR2V0IHRoZSBjdXJyZW50IHNlc3Npb24gKi9cclxuICBnZXRTZXNzaW9uKCk6IFNlc3Npb24gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcclxuICB9XHJcblxyXG4gIC8qKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgc2Vzc2lvbiAqL1xyXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCk7XHJcbiAgfVxyXG5cclxuICAvKiogR2V0IHRoZSBjbGllbnQgY29uZmlndXJhdGlvbiAqL1xyXG4gIGdldENvbmZpZygpOiBHcWxkYkNvbmZpZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8gYSBjbHVzdGVyIGRlcGxveW1lbnQgKi9cclxuICBnZXQgaXNDbHVzdGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5pc0NsdXN0ZXIgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogR2V0IHRoZSBjbHVzdGVyIElEIChlbXB0eSBzdHJpbmcgaWYgbm90IGEgY2x1c3RlcikgKi9cclxuICBnZXQgY2x1c3RlcklkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmNsdXN0ZXJJZCB8fCAnJztcclxuICB9XHJcblxyXG4gIC8qKiBHZXQgdGhlIHBhcnRpdGlvbiBjb3VudCAoMCBpZiBub3QgYSBjbHVzdGVyKSAqL1xyXG4gIGdldCBwYXJ0aXRpb25Db3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5wYXJ0aXRpb25Db3VudCB8fCAwO1xyXG4gIH1cclxufVxyXG4iXX0=
|
package/dist/config.d.ts
ADDED
|
@@ -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;
|