ultipa 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.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/client.d.ts +194 -0
  4. package/dist/client.js +390 -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 -0
  12. package/dist/index.js +88 -0
  13. package/dist/printers.d.ts +33 -0
  14. package/dist/printers.js +312 -0
  15. package/dist/proto/gqldb.proto +632 -0
  16. package/dist/response.d.ts +256 -0
  17. package/dist/response.js +723 -0
  18. package/dist/services/admin-service.d.ts +40 -0
  19. package/dist/services/admin-service.js +115 -0
  20. package/dist/services/bulk-import-service.d.ts +35 -0
  21. package/dist/services/bulk-import-service.js +108 -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 -0
  55. package/dist/types/index.js +36 -0
  56. package/dist/types/metadata.d.ts +60 -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 -0
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * Type conversion utilities between gRPC proto types and JavaScript types.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildGqlRequest = buildGqlRequest;
7
+ exports.buildParameters = buildParameters;
8
+ exports.convertGqlResponse = convertGqlResponse;
9
+ exports.convertTypedValue = convertTypedValue;
10
+ exports.convertProtoProperties = convertProtoProperties;
11
+ exports.convertGraphInfo = convertGraphInfo;
12
+ exports.graphTypeToProto = graphTypeToProto;
13
+ exports.protoToGraphType = protoToGraphType;
14
+ exports.protoToHealthStatus = protoToHealthStatus;
15
+ exports.cacheTypeToProto = cacheTypeToProto;
16
+ exports.nodeDataToProto = nodeDataToProto;
17
+ exports.edgeDataToProto = edgeDataToProto;
18
+ const response_1 = require("../response");
19
+ const types_1 = require("../types");
20
+ /**
21
+ * Build a GQL request from config.
22
+ */
23
+ function buildGqlRequest(query, session, config, queryConfig) {
24
+ return {
25
+ gql: query,
26
+ graph_name: queryConfig?.graphName || session?.defaultGraph || config.defaultGraph || '',
27
+ parameters: buildParameters(queryConfig?.parameters),
28
+ session_id: session?.id?.toString() || '0',
29
+ transaction_id: queryConfig?.transactionId?.toString() || '0',
30
+ timeout: Math.floor((queryConfig?.timeout || config.timeout || 30000) / 1000), // Convert ms to seconds for gRPC
31
+ read_only: queryConfig?.readOnly || false,
32
+ max_path_results: queryConfig?.maxPathResults || 0,
33
+ };
34
+ }
35
+ /**
36
+ * Build parameters array for gRPC.
37
+ */
38
+ function buildParameters(params) {
39
+ if (!params)
40
+ return [];
41
+ return Object.entries(params).map(([name, value]) => ({
42
+ name,
43
+ value: (0, types_1.createTypedValue)(value),
44
+ }));
45
+ }
46
+ /**
47
+ * Convert gRPC response to Response object.
48
+ */
49
+ function convertGqlResponse(grpcResponse) {
50
+ const columns = grpcResponse.columns || [];
51
+ const rows = (grpcResponse.rows || []).map((row) => {
52
+ const rawValues = row.values || [];
53
+ const values = rawValues.map((tv) => convertTypedValue(tv));
54
+ const types = rawValues.map((tv) => protoTypeToEnum(tv?.type));
55
+ return new response_1.Row(values, types);
56
+ });
57
+ return new response_1.Response(columns, rows, parseInt(grpcResponse.row_count || '0', 10), grpcResponse.has_more || false, grpcResponse.warnings || [], parseInt(grpcResponse.rows_affected || '0', 10));
58
+ }
59
+ /**
60
+ * Map proto type string or number to PropertyType enum.
61
+ * Handles both string enum names (e.g., 'PROPERTY_TYPE_STRING') and numeric values.
62
+ */
63
+ function protoTypeToEnum(protoType) {
64
+ // Handle numeric enum values directly
65
+ if (typeof protoType === 'number') {
66
+ // If it's already a valid PropertyType number, return it directly
67
+ // PropertyType ranges from UNSET(0) to EDGE(33)
68
+ if (protoType >= types_1.PropertyType.UNSET && protoType <= types_1.PropertyType.EDGE) {
69
+ return protoType;
70
+ }
71
+ return types_1.PropertyType.NULL;
72
+ }
73
+ const typeMap = {
74
+ 'PROPERTY_TYPE_NULL': types_1.PropertyType.NULL,
75
+ 'PROPERTY_TYPE_UNSET': types_1.PropertyType.UNSET,
76
+ 'PROPERTY_TYPE_BOOL': types_1.PropertyType.BOOL,
77
+ 'PROPERTY_TYPE_INT32': types_1.PropertyType.INT32,
78
+ 'PROPERTY_TYPE_UINT32': types_1.PropertyType.UINT32,
79
+ 'PROPERTY_TYPE_INT64': types_1.PropertyType.INT64,
80
+ 'PROPERTY_TYPE_UINT64': types_1.PropertyType.UINT64,
81
+ 'PROPERTY_TYPE_FLOAT': types_1.PropertyType.FLOAT,
82
+ 'PROPERTY_TYPE_DOUBLE': types_1.PropertyType.DOUBLE,
83
+ 'PROPERTY_TYPE_STRING': types_1.PropertyType.STRING,
84
+ 'PROPERTY_TYPE_TEXT': types_1.PropertyType.TEXT,
85
+ 'PROPERTY_TYPE_BLOB': types_1.PropertyType.BLOB,
86
+ 'PROPERTY_TYPE_TIMESTAMP': types_1.PropertyType.TIMESTAMP,
87
+ 'PROPERTY_TYPE_DATETIME': types_1.PropertyType.DATETIME,
88
+ 'PROPERTY_TYPE_DATE': types_1.PropertyType.DATE,
89
+ 'PROPERTY_TYPE_LOCAL_DATETIME': types_1.PropertyType.LOCAL_DATETIME,
90
+ 'PROPERTY_TYPE_ZONED_DATETIME': types_1.PropertyType.ZONED_DATETIME,
91
+ 'PROPERTY_TYPE_LOCAL_TIME': types_1.PropertyType.LOCAL_TIME,
92
+ 'PROPERTY_TYPE_ZONED_TIME': types_1.PropertyType.ZONED_TIME,
93
+ 'PROPERTY_TYPE_YEAR_TO_MONTH': types_1.PropertyType.YEAR_TO_MONTH,
94
+ 'PROPERTY_TYPE_DAY_TO_SECOND': types_1.PropertyType.DAY_TO_SECOND,
95
+ 'PROPERTY_TYPE_DECIMAL': types_1.PropertyType.DECIMAL,
96
+ 'PROPERTY_TYPE_POINT': types_1.PropertyType.POINT,
97
+ 'PROPERTY_TYPE_POINT3D': types_1.PropertyType.POINT3D,
98
+ 'PROPERTY_TYPE_VECTOR': types_1.PropertyType.VECTOR,
99
+ 'PROPERTY_TYPE_LIST': types_1.PropertyType.LIST,
100
+ 'PROPERTY_TYPE_SET': types_1.PropertyType.SET,
101
+ 'PROPERTY_TYPE_MAP': types_1.PropertyType.MAP,
102
+ 'PROPERTY_TYPE_NODE': types_1.PropertyType.NODE,
103
+ 'PROPERTY_TYPE_EDGE': types_1.PropertyType.EDGE,
104
+ 'PROPERTY_TYPE_PATH': types_1.PropertyType.PATH,
105
+ 'PROPERTY_TYPE_RECORD': types_1.PropertyType.RECORD,
106
+ 'PROPERTY_TYPE_TABLE': types_1.PropertyType.TABLE,
107
+ 'PROPERTY_TYPE_ERROR': types_1.PropertyType.ERROR,
108
+ };
109
+ return typeMap[protoType] ?? types_1.PropertyType.NULL;
110
+ }
111
+ /**
112
+ * Convert gRPC TypedValue to JS value.
113
+ * Uses the same decoding logic as typedValueToJS for consistency.
114
+ */
115
+ function convertTypedValue(tv) {
116
+ if (!tv || tv.is_null || tv.isNull)
117
+ return null;
118
+ const data = tv.data;
119
+ const protoType = tv.type;
120
+ // Handle null types (both string and numeric enum values)
121
+ if (protoType === 'PROPERTY_TYPE_NULL' || protoType === 'PROPERTY_TYPE_UNSET' ||
122
+ protoType === types_1.PropertyType.NULL || protoType === types_1.PropertyType.UNSET) {
123
+ return null;
124
+ }
125
+ // Handle empty data - but STRING type with empty data should return ""
126
+ if (!data || data.length === 0) {
127
+ const isStringType = protoType === 'PROPERTY_TYPE_STRING' || protoType === 'PROPERTY_TYPE_TEXT' ||
128
+ protoType === types_1.PropertyType.STRING || protoType === types_1.PropertyType.TEXT;
129
+ const isBlobType = protoType === 'PROPERTY_TYPE_BLOB' || protoType === types_1.PropertyType.BLOB;
130
+ if (isStringType) {
131
+ return '';
132
+ }
133
+ if (isBlobType) {
134
+ return Buffer.alloc(0);
135
+ }
136
+ return null;
137
+ }
138
+ const buf = Buffer.from(data);
139
+ const enumType = protoTypeToEnum(protoType);
140
+ // Use typedValueToJS for consistent decoding
141
+ return (0, types_1.typedValueToJS)({ type: enumType, data: buf, isNull: false });
142
+ }
143
+ /**
144
+ * Convert proto properties map to JS object.
145
+ */
146
+ function convertProtoProperties(protoProps) {
147
+ const result = {};
148
+ for (const [key, tv] of Object.entries(protoProps)) {
149
+ result[key] = convertTypedValue(tv);
150
+ }
151
+ return result;
152
+ }
153
+ /**
154
+ * Convert GraphInfo from proto to JS object.
155
+ */
156
+ function convertGraphInfo(g) {
157
+ return {
158
+ name: g.name || '',
159
+ graphType: protoToGraphType(g.graph_type),
160
+ nodeCount: parseInt(g.node_count || '0', 10),
161
+ edgeCount: parseInt(g.edge_count || '0', 10),
162
+ description: g.description || '',
163
+ };
164
+ }
165
+ /**
166
+ * Map GraphType enum to proto string.
167
+ */
168
+ function graphTypeToProto(graphType) {
169
+ switch (graphType) {
170
+ case types_1.GraphType.OPEN:
171
+ return 'GRAPH_TYPE_OPEN';
172
+ case types_1.GraphType.CLOSED:
173
+ return 'GRAPH_TYPE_CLOSED';
174
+ case types_1.GraphType.ONTOLOGY:
175
+ return 'GRAPH_TYPE_ONTOLOGY';
176
+ default:
177
+ return 'GRAPH_TYPE_OPEN';
178
+ }
179
+ }
180
+ /**
181
+ * Map proto string to GraphType enum.
182
+ */
183
+ function protoToGraphType(proto) {
184
+ switch (proto) {
185
+ case 'GRAPH_TYPE_CLOSED':
186
+ return types_1.GraphType.CLOSED;
187
+ case 'GRAPH_TYPE_ONTOLOGY':
188
+ return types_1.GraphType.ONTOLOGY;
189
+ default:
190
+ return types_1.GraphType.OPEN;
191
+ }
192
+ }
193
+ /**
194
+ * Map proto HealthStatus to enum.
195
+ */
196
+ function protoToHealthStatus(proto) {
197
+ switch (proto) {
198
+ case 'HEALTH_STATUS_SERVING':
199
+ return types_1.HealthStatus.SERVING;
200
+ case 'HEALTH_STATUS_NOT_SERVING':
201
+ return types_1.HealthStatus.NOT_SERVING;
202
+ case 'HEALTH_STATUS_SERVICE_UNKNOWN':
203
+ return types_1.HealthStatus.SERVICE_UNKNOWN;
204
+ default:
205
+ return types_1.HealthStatus.UNKNOWN;
206
+ }
207
+ }
208
+ /**
209
+ * Map CacheType to proto string.
210
+ */
211
+ function cacheTypeToProto(cacheType) {
212
+ switch (cacheType) {
213
+ case types_1.CacheType.AST:
214
+ return 'CACHE_TYPE_AST';
215
+ case types_1.CacheType.PLAN:
216
+ return 'CACHE_TYPE_PLAN';
217
+ default:
218
+ return 'CACHE_TYPE_ALL';
219
+ }
220
+ }
221
+ /**
222
+ * Convert NodeData to proto format.
223
+ */
224
+ function nodeDataToProto(node) {
225
+ const properties = {};
226
+ if (node.properties) {
227
+ for (const [key, value] of Object.entries(node.properties)) {
228
+ properties[key] = (0, types_1.createTypedValue)(value);
229
+ }
230
+ }
231
+ return {
232
+ id: node.id || '',
233
+ labels: node.labels || [],
234
+ properties,
235
+ };
236
+ }
237
+ /**
238
+ * Convert EdgeData to proto format.
239
+ */
240
+ function edgeDataToProto(edge) {
241
+ const properties = {};
242
+ if (edge.properties) {
243
+ for (const [key, value] of Object.entries(edge.properties)) {
244
+ properties[key] = (0, types_1.createTypedValue)(value);
245
+ }
246
+ }
247
+ return {
248
+ label: edge.label || '',
249
+ from_node_id: edge.fromNodeId || '',
250
+ to_node_id: edge.toNodeId || '',
251
+ properties,
252
+ };
253
+ }
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7QUFtQkgsMENBZ0JDO0FBS0QsMENBTUM7QUFLRCxnREFnQkM7QUE0REQsOENBZ0NDO0FBS0Qsd0RBTUM7QUFLRCw0Q0FRQztBQUtELDRDQVdDO0FBS0QsNENBU0M7QUFLRCxrREFXQztBQUtELDRDQVNDO0FBS0QsMENBWUM7QUFLRCwwQ0FhQztBQXBSRCwwQ0FBNEM7QUFDNUMsb0NBUWtCO0FBS2xCOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixLQUFhLEVBQ2IsT0FBdUIsRUFDdkIsTUFBbUIsRUFDbkIsV0FBeUI7SUFFekIsT0FBTztRQUNMLEdBQUcsRUFBRSxLQUFLO1FBQ1YsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLFlBQVksSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDeEYsVUFBVSxFQUFFLGVBQWUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO1FBQ3BELFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUc7UUFDMUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRztRQUM3RCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxpQ0FBaUM7UUFDaEgsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLElBQUksS0FBSztRQUN6QyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxJQUFJLENBQUM7S0FDbkQsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxNQUE0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QU87UUFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFO1FBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUU7UUFDekIsVUFBVTtLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsSUFBUztJQUN2QyxNQUFNLFVBQVUsR0FBd0IsRUFBRSxDQUFDO0lBQzNDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzNELFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFBLHdCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTztRQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDdkIsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRTtRQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFO1FBQy9CLFVBQVU7S0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUeXBlIGNvbnZlcnNpb24gdXRpbGl0aWVzIGJldHdlZW4gZ1JQQyBwcm90byB0eXBlcyBhbmQgSmF2YVNjcmlwdCB0eXBlcy5cclxuICovXHJcblxyXG5pbXBvcnQgeyBSZXNwb25zZSwgUm93IH0gZnJvbSAnLi4vcmVzcG9uc2UnO1xyXG5pbXBvcnQge1xyXG4gIEdyYXBoVHlwZSxcclxuICBIZWFsdGhTdGF0dXMsXHJcbiAgQ2FjaGVUeXBlLFxyXG4gIEdyYXBoSW5mbyxcclxuICBjcmVhdGVUeXBlZFZhbHVlLFxyXG4gIFByb3BlcnR5VHlwZSxcclxuICB0eXBlZFZhbHVlVG9KUyxcclxufSBmcm9tICcuLi90eXBlcyc7XHJcbmltcG9ydCB7IEdxbGRiQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcclxuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4uL3Nlc3Npb24nO1xyXG5pbXBvcnQgeyBRdWVyeUNvbmZpZyB9IGZyb20gJy4uL2NsaWVudCc7XHJcblxyXG4vKipcclxuICogQnVpbGQgYSBHUUwgcmVxdWVzdCBmcm9tIGNvbmZpZy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdxbFJlcXVlc3QoXHJcbiAgcXVlcnk6IHN0cmluZyxcclxuICBzZXNzaW9uOiBTZXNzaW9uIHwgbnVsbCxcclxuICBjb25maWc6IEdxbGRiQ29uZmlnLFxyXG4gIHF1ZXJ5Q29uZmlnPzogUXVlcnlDb25maWdcclxuKTogYW55IHtcclxuICByZXR1cm4ge1xyXG4gICAgZ3FsOiBxdWVyeSxcclxuICAgIGdyYXBoX25hbWU6IHF1ZXJ5Q29uZmlnPy5ncmFwaE5hbWUgfHwgc2Vzc2lvbj8uZGVmYXVsdEdyYXBoIHx8IGNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycsXHJcbiAgICBwYXJhbWV0ZXJzOiBidWlsZFBhcmFtZXRlcnMocXVlcnlDb25maWc/LnBhcmFtZXRlcnMpLFxyXG4gICAgc2Vzc2lvbl9pZDogc2Vzc2lvbj8uaWQ/LnRvU3RyaW5nKCkgfHwgJzAnLFxyXG4gICAgdHJhbnNhY3Rpb25faWQ6IHF1ZXJ5Q29uZmlnPy50cmFuc2FjdGlvbklkPy50b1N0cmluZygpIHx8ICcwJyxcclxuICAgIHRpbWVvdXQ6IE1hdGguZmxvb3IoKHF1ZXJ5Q29uZmlnPy50aW1lb3V0IHx8IGNvbmZpZy50aW1lb3V0IHx8IDMwMDAwKSAvIDEwMDApLCAvLyBDb252ZXJ0IG1zIHRvIHNlY29uZHMgZm9yIGdSUENcclxuICAgIHJlYWRfb25seTogcXVlcnlDb25maWc/LnJlYWRPbmx5IHx8IGZhbHNlLFxyXG4gICAgbWF4X3BhdGhfcmVzdWx0czogcXVlcnlDb25maWc/Lm1heFBhdGhSZXN1bHRzIHx8IDAsXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkIHBhcmFtZXRlcnMgYXJyYXkgZm9yIGdSUEMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQYXJhbWV0ZXJzKHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnlbXSB7XHJcbiAgaWYgKCFwYXJhbXMpIHJldHVybiBbXTtcclxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocGFyYW1zKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XHJcbiAgICBuYW1lLFxyXG4gICAgdmFsdWU6IGNyZWF0ZVR5cGVkVmFsdWUodmFsdWUpLFxyXG4gIH0pKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnQgZ1JQQyByZXNwb25zZSB0byBSZXNwb25zZSBvYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEdxbFJlc3BvbnNlKGdycGNSZXNwb25zZTogYW55KTogUmVzcG9uc2Uge1xyXG4gIGNvbnN0IGNvbHVtbnMgPSBncnBjUmVzcG9uc2UuY29sdW1ucyB8fCBbXTtcclxuICBjb25zdCByb3dzOiBSb3dbXSA9IChncnBjUmVzcG9uc2Uucm93cyB8fCBbXSkubWFwKChyb3c6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgcmF3VmFsdWVzID0gcm93LnZhbHVlcyB8fCBbXTtcclxuICAgIGNvbnN0IHZhbHVlcyA9IHJhd1ZhbHVlcy5tYXAoKHR2OiBhbnkpID0+IGNvbnZlcnRUeXBlZFZhbHVlKHR2KSk7XHJcbiAgICBjb25zdCB0eXBlcyA9IHJhd1ZhbHVlcy5tYXAoKHR2OiBhbnkpID0+IHByb3RvVHlwZVRvRW51bSh0dj8udHlwZSkpO1xyXG4gICAgcmV0dXJuIG5ldyBSb3codmFsdWVzLCB0eXBlcyk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShcclxuICAgIGNvbHVtbnMsXHJcbiAgICByb3dzLFxyXG4gICAgcGFyc2VJbnQoZ3JwY1Jlc3BvbnNlLnJvd19jb3VudCB8fCAnMCcsIDEwKSxcclxuICAgIGdycGNSZXNwb25zZS5oYXNfbW9yZSB8fCBmYWxzZSxcclxuICAgIGdycGNSZXNwb25zZS53YXJuaW5ncyB8fCBbXSxcclxuICAgIHBhcnNlSW50KGdycGNSZXNwb25zZS5yb3dzX2FmZmVjdGVkIHx8ICcwJywgMTApXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcCBwcm90byB0eXBlIHN0cmluZyBvciBudW1iZXIgdG8gUHJvcGVydHlUeXBlIGVudW0uXHJcbiAqIEhhbmRsZXMgYm90aCBzdHJpbmcgZW51bSBuYW1lcyAoZS5nLiwgJ1BST1BFUlRZX1RZUEVfU1RSSU5HJykgYW5kIG51bWVyaWMgdmFsdWVzLlxyXG4gKi9cclxuZnVuY3Rpb24gcHJvdG9UeXBlVG9FbnVtKHByb3RvVHlwZTogc3RyaW5nIHwgbnVtYmVyKTogUHJvcGVydHlUeXBlIHtcclxuICAvLyBIYW5kbGUgbnVtZXJpYyBlbnVtIHZhbHVlcyBkaXJlY3RseVxyXG4gIGlmICh0eXBlb2YgcHJvdG9UeXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEgdmFsaWQgUHJvcGVydHlUeXBlIG51bWJlciwgcmV0dXJuIGl0IGRpcmVjdGx5XHJcbiAgICAvLyBQcm9wZXJ0eVR5cGUgcmFuZ2VzIGZyb20gVU5TRVQoMCkgdG8gRURHRSgzMylcclxuICAgIGlmIChwcm90b1R5cGUgPj0gUHJvcGVydHlUeXBlLlVOU0VUICYmIHByb3RvVHlwZSA8PSBQcm9wZXJ0eVR5cGUuRURHRSkge1xyXG4gICAgICByZXR1cm4gcHJvdG9UeXBlIGFzIFByb3BlcnR5VHlwZTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9wZXJ0eVR5cGUuTlVMTDtcclxuICB9XHJcblxyXG4gIGNvbnN0IHR5cGVNYXA6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5VHlwZT4gPSB7XHJcbiAgICAnUFJPUEVSVFlfVFlQRV9OVUxMJzogUHJvcGVydHlUeXBlLk5VTEwsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9VTlNFVCc6IFByb3BlcnR5VHlwZS5VTlNFVCxcclxuICAgICdQUk9QRVJUWV9UWVBFX0JPT0wnOiBQcm9wZXJ0eVR5cGUuQk9PTCxcclxuICAgICdQUk9QRVJUWV9UWVBFX0lOVDMyJzogUHJvcGVydHlUeXBlLklOVDMyLFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfVUlOVDMyJzogUHJvcGVydHlUeXBlLlVJTlQzMixcclxuICAgICdQUk9QRVJUWV9UWVBFX0lOVDY0JzogUHJvcGVydHlUeXBlLklOVDY0LFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfVUlOVDY0JzogUHJvcGVydHlUeXBlLlVJTlQ2NCxcclxuICAgICdQUk9QRVJUWV9UWVBFX0ZMT0FUJzogUHJvcGVydHlUeXBlLkZMT0FULFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfRE9VQkxFJzogUHJvcGVydHlUeXBlLkRPVUJMRSxcclxuICAgICdQUk9QRVJUWV9UWVBFX1NUUklORyc6IFByb3BlcnR5VHlwZS5TVFJJTkcsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9URVhUJzogUHJvcGVydHlUeXBlLlRFWFQsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9CTE9CJzogUHJvcGVydHlUeXBlLkJMT0IsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9USU1FU1RBTVAnOiBQcm9wZXJ0eVR5cGUuVElNRVNUQU1QLFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfREFURVRJTUUnOiBQcm9wZXJ0eVR5cGUuREFURVRJTUUsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9EQVRFJzogUHJvcGVydHlUeXBlLkRBVEUsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9MT0NBTF9EQVRFVElNRSc6IFByb3BlcnR5VHlwZS5MT0NBTF9EQVRFVElNRSxcclxuICAgICdQUk9QRVJUWV9UWVBFX1pPTkVEX0RBVEVUSU1FJzogUHJvcGVydHlUeXBlLlpPTkVEX0RBVEVUSU1FLFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfTE9DQUxfVElNRSc6IFByb3BlcnR5VHlwZS5MT0NBTF9USU1FLFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfWk9ORURfVElNRSc6IFByb3BlcnR5VHlwZS5aT05FRF9USU1FLFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfWUVBUl9UT19NT05USCc6IFByb3BlcnR5VHlwZS5ZRUFSX1RPX01PTlRILFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfREFZX1RPX1NFQ09ORCc6IFByb3BlcnR5VHlwZS5EQVlfVE9fU0VDT05ELFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfREVDSU1BTCc6IFByb3BlcnR5VHlwZS5ERUNJTUFMLFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfUE9JTlQnOiBQcm9wZXJ0eVR5cGUuUE9JTlQsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9QT0lOVDNEJzogUHJvcGVydHlUeXBlLlBPSU5UM0QsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9WRUNUT1InOiBQcm9wZXJ0eVR5cGUuVkVDVE9SLFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfTElTVCc6IFByb3BlcnR5VHlwZS5MSVNULFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfU0VUJzogUHJvcGVydHlUeXBlLlNFVCxcclxuICAgICdQUk9QRVJUWV9UWVBFX01BUCc6IFByb3BlcnR5VHlwZS5NQVAsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9OT0RFJzogUHJvcGVydHlUeXBlLk5PREUsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9FREdFJzogUHJvcGVydHlUeXBlLkVER0UsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9QQVRIJzogUHJvcGVydHlUeXBlLlBBVEgsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9SRUNPUkQnOiBQcm9wZXJ0eVR5cGUuUkVDT1JELFxyXG4gICAgJ1BST1BFUlRZX1RZUEVfVEFCTEUnOiBQcm9wZXJ0eVR5cGUuVEFCTEUsXHJcbiAgICAnUFJPUEVSVFlfVFlQRV9FUlJPUic6IFByb3BlcnR5VHlwZS5FUlJPUixcclxuICB9O1xyXG4gIHJldHVybiB0eXBlTWFwW3Byb3RvVHlwZV0gPz8gUHJvcGVydHlUeXBlLk5VTEw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IGdSUEMgVHlwZWRWYWx1ZSB0byBKUyB2YWx1ZS5cclxuICogVXNlcyB0aGUgc2FtZSBkZWNvZGluZyBsb2dpYyBhcyB0eXBlZFZhbHVlVG9KUyBmb3IgY29uc2lzdGVuY3kuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFR5cGVkVmFsdWUodHY6IGFueSk6IGFueSB7XHJcbiAgaWYgKCF0diB8fCB0di5pc19udWxsIHx8IHR2LmlzTnVsbCkgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvbnN0IGRhdGEgPSB0di5kYXRhO1xyXG4gIGNvbnN0IHByb3RvVHlwZSA9IHR2LnR5cGU7XHJcblxyXG4gIC8vIEhhbmRsZSBudWxsIHR5cGVzIChib3RoIHN0cmluZyBhbmQgbnVtZXJpYyBlbnVtIHZhbHVlcylcclxuICBpZiAocHJvdG9UeXBlID09PSAnUFJPUEVSVFlfVFlQRV9OVUxMJyB8fCBwcm90b1R5cGUgPT09ICdQUk9QRVJUWV9UWVBFX1VOU0VUJyB8fFxyXG4gICAgICBwcm90b1R5cGUgPT09IFByb3BlcnR5VHlwZS5OVUxMIHx8IHByb3RvVHlwZSA9PT0gUHJvcGVydHlUeXBlLlVOU0VUKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBlbXB0eSBkYXRhIC0gYnV0IFNUUklORyB0eXBlIHdpdGggZW1wdHkgZGF0YSBzaG91bGQgcmV0dXJuIFwiXCJcclxuICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgIGNvbnN0IGlzU3RyaW5nVHlwZSA9IHByb3RvVHlwZSA9PT0gJ1BST1BFUlRZX1RZUEVfU1RSSU5HJyB8fCBwcm90b1R5cGUgPT09ICdQUk9QRVJUWV9UWVBFX1RFWFQnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1R5cGUgPT09IFByb3BlcnR5VHlwZS5TVFJJTkcgfHwgcHJvdG9UeXBlID09PSBQcm9wZXJ0eVR5cGUuVEVYVDtcclxuICAgIGNvbnN0IGlzQmxvYlR5cGUgPSBwcm90b1R5cGUgPT09ICdQUk9QRVJUWV9UWVBFX0JMT0InIHx8IHByb3RvVHlwZSA9PT0gUHJvcGVydHlUeXBlLkJMT0I7XHJcblxyXG4gICAgaWYgKGlzU3RyaW5nVHlwZSkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNCbG9iVHlwZSkge1xyXG4gICAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShkYXRhKTtcclxuICBjb25zdCBlbnVtVHlwZSA9IHByb3RvVHlwZVRvRW51bShwcm90b1R5cGUpO1xyXG5cclxuICAvLyBVc2UgdHlwZWRWYWx1ZVRvSlMgZm9yIGNvbnNpc3RlbnQgZGVjb2RpbmdcclxuICByZXR1cm4gdHlwZWRWYWx1ZVRvSlMoeyB0eXBlOiBlbnVtVHlwZSwgZGF0YTogYnVmLCBpc051bGw6IGZhbHNlIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBwcm90byBwcm9wZXJ0aWVzIG1hcCB0byBKUyBvYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFByb3RvUHJvcGVydGllcyhwcm90b1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgZm9yIChjb25zdCBba2V5LCB0dl0gb2YgT2JqZWN0LmVudHJpZXMocHJvdG9Qcm9wcykpIHtcclxuICAgIHJlc3VsdFtrZXldID0gY29udmVydFR5cGVkVmFsdWUodHYpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBHcmFwaEluZm8gZnJvbSBwcm90byB0byBKUyBvYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEdyYXBoSW5mbyhnOiBhbnkpOiBHcmFwaEluZm8ge1xyXG4gIHJldHVybiB7XHJcbiAgICBuYW1lOiBnLm5hbWUgfHwgJycsXHJcbiAgICBncmFwaFR5cGU6IHByb3RvVG9HcmFwaFR5cGUoZy5ncmFwaF90eXBlKSxcclxuICAgIG5vZGVDb3VudDogcGFyc2VJbnQoZy5ub2RlX2NvdW50IHx8ICcwJywgMTApLFxyXG4gICAgZWRnZUNvdW50OiBwYXJzZUludChnLmVkZ2VfY291bnQgfHwgJzAnLCAxMCksXHJcbiAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbiB8fCAnJyxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogTWFwIEdyYXBoVHlwZSBlbnVtIHRvIHByb3RvIHN0cmluZy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBncmFwaFR5cGVUb1Byb3RvKGdyYXBoVHlwZTogR3JhcGhUeXBlKTogc3RyaW5nIHtcclxuICBzd2l0Y2ggKGdyYXBoVHlwZSkge1xyXG4gICAgY2FzZSBHcmFwaFR5cGUuT1BFTjpcclxuICAgICAgcmV0dXJuICdHUkFQSF9UWVBFX09QRU4nO1xyXG4gICAgY2FzZSBHcmFwaFR5cGUuQ0xPU0VEOlxyXG4gICAgICByZXR1cm4gJ0dSQVBIX1RZUEVfQ0xPU0VEJztcclxuICAgIGNhc2UgR3JhcGhUeXBlLk9OVE9MT0dZOlxyXG4gICAgICByZXR1cm4gJ0dSQVBIX1RZUEVfT05UT0xPR1knO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICdHUkFQSF9UWVBFX09QRU4nO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcCBwcm90byBzdHJpbmcgdG8gR3JhcGhUeXBlIGVudW0uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdG9Ub0dyYXBoVHlwZShwcm90bzogc3RyaW5nKTogR3JhcGhUeXBlIHtcclxuICBzd2l0Y2ggKHByb3RvKSB7XHJcbiAgICBjYXNlICdHUkFQSF9UWVBFX0NMT1NFRCc6XHJcbiAgICAgIHJldHVybiBHcmFwaFR5cGUuQ0xPU0VEO1xyXG4gICAgY2FzZSAnR1JBUEhfVFlQRV9PTlRPTE9HWSc6XHJcbiAgICAgIHJldHVybiBHcmFwaFR5cGUuT05UT0xPR1k7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gR3JhcGhUeXBlLk9QRU47XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogTWFwIHByb3RvIEhlYWx0aFN0YXR1cyB0byBlbnVtLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3RvVG9IZWFsdGhTdGF0dXMocHJvdG86IHN0cmluZyk6IEhlYWx0aFN0YXR1cyB7XHJcbiAgc3dpdGNoIChwcm90bykge1xyXG4gICAgY2FzZSAnSEVBTFRIX1NUQVRVU19TRVJWSU5HJzpcclxuICAgICAgcmV0dXJuIEhlYWx0aFN0YXR1cy5TRVJWSU5HO1xyXG4gICAgY2FzZSAnSEVBTFRIX1NUQVRVU19OT1RfU0VSVklORyc6XHJcbiAgICAgIHJldHVybiBIZWFsdGhTdGF0dXMuTk9UX1NFUlZJTkc7XHJcbiAgICBjYXNlICdIRUFMVEhfU1RBVFVTX1NFUlZJQ0VfVU5LTk9XTic6XHJcbiAgICAgIHJldHVybiBIZWFsdGhTdGF0dXMuU0VSVklDRV9VTktOT1dOO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIEhlYWx0aFN0YXR1cy5VTktOT1dOO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcCBDYWNoZVR5cGUgdG8gcHJvdG8gc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlVHlwZVRvUHJvdG8oY2FjaGVUeXBlOiBDYWNoZVR5cGUpOiBzdHJpbmcge1xyXG4gIHN3aXRjaCAoY2FjaGVUeXBlKSB7XHJcbiAgICBjYXNlIENhY2hlVHlwZS5BU1Q6XHJcbiAgICAgIHJldHVybiAnQ0FDSEVfVFlQRV9BU1QnO1xyXG4gICAgY2FzZSBDYWNoZVR5cGUuUExBTjpcclxuICAgICAgcmV0dXJuICdDQUNIRV9UWVBFX1BMQU4nO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICdDQUNIRV9UWVBFX0FMTCc7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBOb2RlRGF0YSB0byBwcm90byBmb3JtYXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbm9kZURhdGFUb1Byb3RvKG5vZGU6IGFueSk6IGFueSB7XHJcbiAgY29uc3QgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gIGlmIChub2RlLnByb3BlcnRpZXMpIHtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUucHJvcGVydGllcykpIHtcclxuICAgICAgcHJvcGVydGllc1trZXldID0gY3JlYXRlVHlwZWRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICBpZDogbm9kZS5pZCB8fCAnJyxcclxuICAgIGxhYmVsczogbm9kZS5sYWJlbHMgfHwgW10sXHJcbiAgICBwcm9wZXJ0aWVzLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IEVkZ2VEYXRhIHRvIHByb3RvIGZvcm1hdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlZGdlRGF0YVRvUHJvdG8oZWRnZTogYW55KTogYW55IHtcclxuICBjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgaWYgKGVkZ2UucHJvcGVydGllcykge1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZWRnZS5wcm9wZXJ0aWVzKSkge1xyXG4gICAgICBwcm9wZXJ0aWVzW2tleV0gPSBjcmVhdGVUeXBlZFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIGxhYmVsOiBlZGdlLmxhYmVsIHx8ICcnLFxyXG4gICAgZnJvbV9ub2RlX2lkOiBlZGdlLmZyb21Ob2RlSWQgfHwgJycsXHJcbiAgICB0b19ub2RlX2lkOiBlZGdlLnRvTm9kZUlkIHx8ICcnLFxyXG4gICAgcHJvcGVydGllcyxcclxuICB9O1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Data service handles node and edge insert/delete/export operations.
3
+ */
4
+ import { ServiceContext } from './service-context';
5
+ import { InsertNodesResult, InsertEdgesResult, DeleteResult, ExportNodesResult, ExportEdgesResult, ExportConfig, ExportChunk } from '../response';
6
+ import { NodeData, EdgeData } from '../types';
7
+ import { InsertNodesConfig, InsertEdgesConfig } from '../client';
8
+ /**
9
+ * Data service for inserting, deleting, and exporting graph data.
10
+ */
11
+ export declare class DataService {
12
+ private ctx;
13
+ constructor(ctx: ServiceContext);
14
+ /**
15
+ * Insert multiple nodes into a graph.
16
+ */
17
+ insertNodes(graphName: string, nodes: NodeData[], config?: InsertNodesConfig): Promise<InsertNodesResult>;
18
+ /**
19
+ * Insert multiple edges into a graph.
20
+ */
21
+ insertEdges(graphName: string, edges: EdgeData[], config?: InsertEdgesConfig): Promise<InsertEdgesResult>;
22
+ /**
23
+ * Delete nodes from a graph.
24
+ */
25
+ deleteNodes(graphName: string, nodeIds?: string[], labels?: string[], where?: string): Promise<DeleteResult>;
26
+ /**
27
+ * Delete edges from a graph.
28
+ */
29
+ deleteEdges(graphName: string, edgeIds?: string[], label?: string, where?: string): Promise<DeleteResult>;
30
+ /**
31
+ * Export graph data in JSON Lines format (streaming).
32
+ */
33
+ export(config: ExportConfig, callback?: (chunk: ExportChunk) => void): Promise<void>;
34
+ /**
35
+ * Stream nodes from a graph.
36
+ * @deprecated Use export() with ExportConfig instead
37
+ */
38
+ exportNodes(graphName: string, labels?: string[], limit?: number, callback?: (result: ExportNodesResult) => void): Promise<void>;
39
+ /**
40
+ * Stream edges from a graph.
41
+ * @deprecated Use export() with ExportConfig instead
42
+ */
43
+ exportEdges(graphName: string, labels?: string[], limit?: number, callback?: (result: ExportEdgesResult) => void): Promise<void>;
44
+ }
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * Data service handles node and edge insert/delete/export operations.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DataService = void 0;
7
+ const services_1 = require("../services");
8
+ const converters_1 = require("./converters");
9
+ /**
10
+ * Data service for inserting, deleting, and exporting graph data.
11
+ */
12
+ class DataService {
13
+ ctx;
14
+ constructor(ctx) {
15
+ this.ctx = ctx;
16
+ }
17
+ /**
18
+ * Insert multiple nodes into a graph.
19
+ */
20
+ async insertNodes(graphName, nodes, config) {
21
+ const request = {
22
+ graph_name: graphName,
23
+ nodes: nodes.map((n) => (0, converters_1.nodeDataToProto)(n)),
24
+ };
25
+ // ALWAYS set options (even when undefined) to avoid deprecated bulk operations error
26
+ request.options = { overwrite: config?.options?.overwrite || false };
27
+ if (config?.bulkImportSessionId) {
28
+ request.bulk_import_session_id = config.bulkImportSessionId;
29
+ }
30
+ const metadata = this.ctx.getSessionMetadata();
31
+ const response = await (0, services_1.promisifyCall)(this.ctx.clients.dataService, 'InsertNodes', request, metadata);
32
+ return {
33
+ success: response.success || false,
34
+ nodeIds: response.node_ids || [],
35
+ nodeCount: parseInt(response.node_count || '0', 10),
36
+ message: response.message || '',
37
+ };
38
+ }
39
+ /**
40
+ * Insert multiple edges into a graph.
41
+ */
42
+ async insertEdges(graphName, edges, config) {
43
+ const request = {
44
+ graph_name: graphName,
45
+ edges: edges.map((e) => (0, converters_1.edgeDataToProto)(e)),
46
+ };
47
+ // ALWAYS set options (even when undefined) to avoid deprecated bulk operations error
48
+ request.options = {
49
+ skip_invalid_nodes: config?.options?.skipInvalidNodes || false,
50
+ };
51
+ if (config?.bulkImportSessionId) {
52
+ request.bulk_import_session_id = config.bulkImportSessionId;
53
+ }
54
+ const metadata = this.ctx.getSessionMetadata();
55
+ const response = await (0, services_1.promisifyCall)(this.ctx.clients.dataService, 'InsertEdges', request, metadata);
56
+ return {
57
+ success: response.success || false,
58
+ edgeIds: response.edge_ids || [],
59
+ edgeCount: parseInt(response.edge_count || '0', 10),
60
+ message: response.message || '',
61
+ skippedCount: parseInt(response.skipped_count || '0', 10),
62
+ };
63
+ }
64
+ /**
65
+ * Delete nodes from a graph.
66
+ */
67
+ async deleteNodes(graphName, nodeIds, labels, where) {
68
+ const request = {
69
+ graph_name: graphName,
70
+ node_ids: nodeIds || [],
71
+ labels: labels || [],
72
+ where: where || '',
73
+ };
74
+ const metadata = this.ctx.getSessionMetadata();
75
+ const response = await (0, services_1.promisifyCall)(this.ctx.clients.dataService, 'DeleteNodes', request, metadata);
76
+ return {
77
+ success: response.success || false,
78
+ deletedCount: parseInt(response.deleted_count || '0', 10),
79
+ message: response.message || '',
80
+ };
81
+ }
82
+ /**
83
+ * Delete edges from a graph.
84
+ */
85
+ async deleteEdges(graphName, edgeIds, label, where) {
86
+ const request = {
87
+ graph_name: graphName,
88
+ edge_ids: edgeIds || [],
89
+ label: label || '',
90
+ where: where || '',
91
+ };
92
+ const metadata = this.ctx.getSessionMetadata();
93
+ const response = await (0, services_1.promisifyCall)(this.ctx.clients.dataService, 'DeleteEdges', request, metadata);
94
+ return {
95
+ success: response.success || false,
96
+ deletedCount: parseInt(response.deleted_count || '0', 10),
97
+ message: response.message || '',
98
+ };
99
+ }
100
+ /**
101
+ * Export graph data in JSON Lines format (streaming).
102
+ */
103
+ async export(config, callback) {
104
+ const request = {
105
+ graph_name: config.graphName,
106
+ batch_size: config.batchSize || 0,
107
+ export_nodes: config.exportNodes !== false,
108
+ export_edges: config.exportEdges !== false,
109
+ node_labels: config.nodeLabels || [],
110
+ edge_labels: config.edgeLabels || [],
111
+ include_metadata: config.includeMetadata || false,
112
+ };
113
+ const metadata = this.ctx.getSessionMetadata();
114
+ return new Promise((resolve, reject) => {
115
+ const stream = this.ctx.clients.dataService.Export(request, metadata);
116
+ stream.on('data', (response) => {
117
+ if (callback) {
118
+ let stats;
119
+ if (response.stats) {
120
+ stats = {
121
+ nodesExported: parseInt(response.stats.nodes_exported || '0', 10),
122
+ edgesExported: parseInt(response.stats.edges_exported || '0', 10),
123
+ bytesWritten: parseInt(response.stats.bytes_written || '0', 10),
124
+ durationMs: parseInt(response.stats.duration_ms || '0', 10),
125
+ };
126
+ }
127
+ const chunk = {
128
+ data: Buffer.from(response.data || []),
129
+ isFinal: response.is_final || false,
130
+ stats,
131
+ };
132
+ callback(chunk);
133
+ }
134
+ if (response.is_final) {
135
+ stream.cancel();
136
+ }
137
+ });
138
+ stream.on('end', () => resolve());
139
+ stream.on('error', (error) => reject(error));
140
+ });
141
+ }
142
+ /**
143
+ * Stream nodes from a graph.
144
+ * @deprecated Use export() with ExportConfig instead
145
+ */
146
+ async exportNodes(graphName, labels, limit = 0, callback) {
147
+ console.warn('exportNodes is deprecated, use export() with ExportConfig instead');
148
+ const request = {
149
+ graph_name: graphName,
150
+ labels: labels || [],
151
+ limit: limit.toString(),
152
+ };
153
+ const metadata = this.ctx.getSessionMetadata();
154
+ return new Promise((resolve, reject) => {
155
+ const stream = this.ctx.clients.dataService.ExportNodes(request, metadata);
156
+ stream.on('data', (response) => {
157
+ if (callback) {
158
+ callback({
159
+ nodes: (response.nodes || []).map((n) => ({
160
+ id: n.id || '',
161
+ labels: n.labels || [],
162
+ properties: (0, converters_1.convertProtoProperties)(n.properties || {}),
163
+ })),
164
+ hasMore: response.has_more || false,
165
+ });
166
+ }
167
+ });
168
+ stream.on('end', () => resolve());
169
+ stream.on('error', (error) => reject(error));
170
+ });
171
+ }
172
+ /**
173
+ * Stream edges from a graph.
174
+ * @deprecated Use export() with ExportConfig instead
175
+ */
176
+ async exportEdges(graphName, labels, limit = 0, callback) {
177
+ console.warn('exportEdges is deprecated, use export() with ExportConfig instead');
178
+ const request = {
179
+ graph_name: graphName,
180
+ labels: labels || [],
181
+ limit: limit.toString(),
182
+ };
183
+ const metadata = this.ctx.getSessionMetadata();
184
+ return new Promise((resolve, reject) => {
185
+ const stream = this.ctx.clients.dataService.ExportEdges(request, metadata);
186
+ stream.on('data', (response) => {
187
+ if (callback) {
188
+ callback({
189
+ edges: (response.edges || []).map((e) => ({
190
+ id: e.id || '',
191
+ label: e.label || '',
192
+ fromNodeId: e.from_node_id || '',
193
+ toNodeId: e.to_node_id || '',
194
+ properties: (0, converters_1.convertProtoProperties)(e.properties || {}),
195
+ })),
196
+ hasMore: response.has_more || false,
197
+ });
198
+ }
199
+ });
200
+ stream.on('end', () => resolve());
201
+ stream.on('error', (error) => reject(error));
202
+ });
203
+ }
204
+ }
205
+ exports.DataService = DataService;
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2RhdGEtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQWNILDBDQUE0QztBQUM1Qyw2Q0FBd0Y7QUFHeEY7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFDRjtJQUFwQixZQUFvQixHQUFtQjtRQUFuQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtJQUFHLENBQUM7SUFFM0M7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLFNBQWlCLEVBQ2pCLEtBQWlCLEVBQ2pCLE1BQTBCO1FBRTFCLE1BQU0sT0FBTyxHQUFRO1lBQ25CLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDRCQUFlLEVBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUMsQ0FBQztRQUVGLHFGQUFxRjtRQUNyRixPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBRXJFLElBQUksTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUM5RCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFRLE1BQU0sSUFBQSx3QkFBYSxFQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQzVCLGFBQWEsRUFDYixPQUFPLEVBQ1AsUUFBUSxDQUNULENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksS0FBSztZQUNsQyxPQUFPLEVB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QyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDN0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRTs0QkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFOzRCQUNwQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFOzRCQUNoQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxFQUFFOzRCQUM1QixVQUFVLEVBQUUsSUFBQSxtQ0FBc0IsRUFBQyxDQUFDLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQzt5QkFDdkQsQ0FBQyxDQUFDO3dCQUNILE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxJQUFJLEtBQUs7cUJBQ3BDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXBSRCxrQ0FvUkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogRGF0YSBzZXJ2aWNlIGhhbmRsZXMgbm9kZSBhbmQgZWRnZSBpbnNlcnQvZGVsZXRlL2V4cG9ydCBvcGVyYXRpb25zLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSAnLi9zZXJ2aWNlLWNvbnRleHQnO1xyXG5pbXBvcnQge1xyXG4gIEluc2VydE5vZGVzUmVzdWx0LFxyXG4gIEluc2VydEVkZ2VzUmVzdWx0LFxyXG4gIERlbGV0ZVJlc3VsdCxcclxuICBFeHBvcnROb2Rlc1Jlc3VsdCxcclxuICBFeHBvcnRFZGdlc1Jlc3VsdCxcclxuICBFeHBvcnRDb25maWcsXHJcbiAgRXhwb3J0Q2h1bmssXHJcbiAgRXhwb3J0U3RhdHMsXHJcbn0gZnJvbSAnLi4vcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBOb2RlRGF0YSwgRWRnZURhdGEgfSBmcm9tICcuLi90eXBlcyc7XHJcbmltcG9ydCB7IHByb21pc2lmeUNhbGwgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IG5vZGVEYXRhVG9Qcm90bywgZWRnZURhdGFUb1Byb3RvLCBjb252ZXJ0UHJvdG9Qcm9wZXJ0aWVzIH0gZnJvbSAnLi9jb252ZXJ0ZXJzJztcclxuaW1wb3J0IHsgSW5zZXJ0Tm9kZXNDb25maWcsIEluc2VydEVkZ2VzQ29uZmlnIH0gZnJvbSAnLi4vY2xpZW50JztcclxuXHJcbi8qKlxyXG4gKiBEYXRhIHNlcnZpY2UgZm9yIGluc2VydGluZywgZGVsZXRpbmcsIGFuZCBleHBvcnRpbmcgZ3JhcGggZGF0YS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBEYXRhU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjdHg6IFNlcnZpY2VDb250ZXh0KSB7fVxyXG5cclxuICAvKipcclxuICAgKiBJbnNlcnQgbXVsdGlwbGUgbm9kZXMgaW50byBhIGdyYXBoLlxyXG4gICAqL1xyXG4gIGFzeW5jIGluc2VydE5vZGVzKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBub2RlczogTm9kZURhdGFbXSxcclxuICAgIGNvbmZpZz86IEluc2VydE5vZGVzQ29uZmlnXHJcbiAgKTogUHJvbWlzZTxJbnNlcnROb2Rlc1Jlc3VsdD4ge1xyXG4gICAgY29uc3QgcmVxdWVzdDogYW55ID0ge1xyXG4gICAgICBncmFwaF9uYW1lOiBncmFwaE5hbWUsXHJcbiAgICAgIG5vZGVzOiBub2Rlcy5tYXAoKG4pID0+IG5vZGVEYXRhVG9Qcm90byhuKSksXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFMV0FZUyBzZXQgb3B0aW9ucyAoZXZlbiB3aGVuIHVuZGVmaW5lZCkgdG8gYXZvaWQgZGVwcmVjYXRlZCBidWxrIG9wZXJhdGlvbnMgZXJyb3JcclxuICAgIHJlcXVlc3Qub3B0aW9ucyA9IHsgb3ZlcndyaXRlOiBjb25maWc/Lm9wdGlvbnM/Lm92ZXJ3cml0ZSB8fCBmYWxzZSB9O1xyXG5cclxuICAgIGlmIChjb25maWc/LmJ1bGtJbXBvcnRTZXNzaW9uSWQpIHtcclxuICAgICAgcmVxdWVzdC5idWxrX2ltcG9ydF9zZXNzaW9uX2lkID0gY29uZmlnLmJ1bGtJbXBvcnRTZXNzaW9uSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBhd2FpdCBwcm9taXNpZnlDYWxsKFxyXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmRhdGFTZXJ2aWNlLFxyXG4gICAgICAnSW5zZXJ0Tm9kZXMnLFxyXG4gICAgICByZXF1ZXN0LFxyXG4gICAgICBtZXRhZGF0YVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdWNjZXNzOiByZXNwb25zZS5zdWNjZXNzIHx8IGZhbHNlLFxyXG4gICAgICBub2RlSWRzOiByZXNwb25zZS5ub2RlX2lkcyB8fCBbXSxcclxuICAgICAgbm9kZUNvdW50OiBwYXJzZUludChyZXNwb25zZS5ub2RlX2NvdW50IHx8ICcwJywgMTApLFxyXG4gICAgICBtZXNzYWdlOiByZXNwb25zZS5tZXNzYWdlIHx8ICcnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydCBtdWx0aXBsZSBlZGdlcyBpbnRvIGEgZ3JhcGguXHJcbiAgICovXHJcbiAgYXN5bmMgaW5zZXJ0RWRnZXMoXHJcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcclxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxyXG4gICAgY29uZmlnPzogSW5zZXJ0RWRnZXNDb25maWdcclxuICApOiBQcm9taXNlPEluc2VydEVkZ2VzUmVzdWx0PiB7XHJcbiAgICBjb25zdCByZXF1ZXN0OiBhbnkgPSB7XHJcbiAgICAgIGdyYXBoX25hbWU6IGdyYXBoTmFtZSxcclxuICAgICAgZWRnZXM6IGVkZ2VzLm1hcCgoZSkgPT4gZWRnZURhdGFUb1Byb3RvKGUpKSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gQUxXQVlTIHNldCBvcHRpb25zIChldmVuIHdoZW4gdW5kZWZpbmVkKSB0byBhdm9pZCBkZXByZWNhdGVkIGJ1bGsgb3BlcmF0aW9ucyBlcnJvclxyXG4gICAgcmVxdWVzdC5vcHRpb25zID0ge1xyXG4gICAgICBza2lwX2ludmFsaWRfbm9kZXM6IGNvbmZpZz8ub3B0aW9ucz8uc2tpcEludmFsaWROb2RlcyB8fCBmYWxzZSxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGNvbmZpZz8uYnVsa0ltcG9ydFNlc3Npb25JZCkge1xyXG4gICAgICByZXF1ZXN0LmJ1bGtfaW1wb3J0X3Nlc3Npb25faWQgPSBjb25maWcuYnVsa0ltcG9ydFNlc3Npb25JZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY3R4LmdldFNlc3Npb25NZXRhZGF0YSgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXHJcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuZGF0YVNlcnZpY2UsXHJcbiAgICAgICdJbnNlcnRFZGdlcycsXHJcbiAgICAgIHJlcXVlc3QsXHJcbiAgICAgIG1ldGFkYXRhXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1Y2Nlc3M6IHJlc3BvbnNlLnN1Y2Nlc3MgfHwgZmFsc2UsXHJcbiAgICAgIGVkZ2VJZHM6IHJlc3BvbnNlLmVkZ2VfaWRzIHx8IFtdLFxyXG4gICAgICBlZGdlQ291bnQ6IHBhcnNlSW50KHJlc3BvbnNlLmVkZ2VfY291bnQgfHwgJzAnLCAxMCksXHJcbiAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLm1lc3NhZ2UgfHwgJycsXHJcbiAgICAgIHNraXBwZWRDb3VudDogcGFyc2VJbnQocmVzcG9uc2Uuc2tpcHBlZF9jb3VudCB8fCAnMCcsIDEwKSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgbm9kZXMgZnJvbSBhIGdyYXBoLlxyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZU5vZGVzKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBub2RlSWRzPzogc3RyaW5nW10sXHJcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcclxuICAgIHdoZXJlPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgIGdyYXBoX25hbWU6IGdyYXBoTmFtZSxcclxuICAgICAgbm9kZV9pZHM6IG5vZGVJZHMgfHwgW10sXHJcbiAgICAgIGxhYmVsczogbGFiZWxzIHx8IFtdLFxyXG4gICAgICB3aGVyZTogd2hlcmUgfHwgJycsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XHJcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcHJvbWlzaWZ5Q2FsbChcclxuICAgICAgdGhpcy5jdHguY2xpZW50cy5kYXRhU2VydmljZSxcclxuICAgICAgJ0RlbGV0ZU5vZGVzJyxcclxuICAgICAgcmVxdWVzdCxcclxuICAgICAgbWV0YWRhdGFcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3VjY2VzczogcmVzcG9uc2Uuc3VjY2VzcyB8fCBmYWxzZSxcclxuICAgICAgZGVsZXRlZENvdW50OiBwYXJzZUludChyZXNwb25zZS5kZWxldGVkX2NvdW50IHx8ICcwJywgMTApLFxyXG4gICAgICBtZXNzYWdlOiByZXNwb25zZS5tZXNzYWdlIHx8ICcnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBlZGdlcyBmcm9tIGEgZ3JhcGguXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlRWRnZXMoXHJcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcclxuICAgIGVkZ2VJZHM/OiBzdHJpbmdbXSxcclxuICAgIGxhYmVsPzogc3RyaW5nLFxyXG4gICAgd2hlcmU/OiBzdHJpbmdcclxuICApOiBQcm9taXNlPERlbGV0ZVJlc3VsdD4ge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgZ3JhcGhfbmFtZTogZ3JhcGhOYW1lLFxyXG4gICAgICBlZGdlX2lkczogZWRnZUlkcyB8fCBbXSxcclxuICAgICAgbGFiZWw6IGxhYmVsIHx8ICcnLFxyXG4gICAgICB3aGVyZTogd2hlcmUgfHwgJycsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XHJcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcHJvbWlzaWZ5Q2FsbChcclxuICAgICAgdGhpcy5jdHguY2xpZW50cy5kYXRhU2VydmljZSxcclxuICAgICAgJ0RlbGV0ZUVkZ2VzJyxcclxuICAgICAgcmVxdWVzdCxcclxuICAgICAgbWV0YWRhdGFcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3VjY2VzczogcmVzcG9uc2Uuc3VjY2VzcyB8fCBmYWxzZSxcclxuICAgICAgZGVsZXRlZENvdW50OiBwYXJzZUludChyZXNwb25zZS5kZWxldGVkX2NvdW50IHx8ICcwJywgMTApLFxyXG4gICAgICBtZXNzYWdlOiByZXNwb25zZS5tZXNzYWdlIHx8ICcnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCBncmFwaCBkYXRhIGluIEpTT04gTGluZXMgZm9ybWF0IChzdHJlYW1pbmcpLlxyXG4gICAqL1xyXG4gIGFzeW5jIGV4cG9ydChcclxuICAgIGNvbmZpZzogRXhwb3J0Q29uZmlnLFxyXG4gICAgY2FsbGJhY2s/OiAoY2h1bms6IEV4cG9ydENodW5rKSA9PiB2b2lkXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICBncmFwaF9uYW1lOiBjb25maWcuZ3JhcGhOYW1lLFxyXG4gICAgICBiYXRjaF9zaXplOiBjb25maWcuYmF0Y2hTaXplIHx8IDAsXHJcbiAgICAgIGV4cG9ydF9ub2RlczogY29uZmlnLmV4cG9ydE5vZGVzICE9PSBmYWxzZSxcclxuICAgICAgZXhwb3J0X2VkZ2VzOiBjb25maWcuZXhwb3J0RWRnZXMgIT09IGZhbHNlLFxyXG4gICAgICBub2RlX2xhYmVsczogY29uZmlnLm5vZGVMYWJlbHMgfHwgW10sXHJcbiAgICAgIGVkZ2VfbGFiZWxzOiBjb25maWcuZWRnZUxhYmVscyB8fCBbXSxcclxuICAgICAgaW5jbHVkZV9tZXRhZGF0YTogY29uZmlnLmluY2x1ZGVNZXRhZGF0YSB8fCBmYWxzZSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBzdHJlYW0gPSAodGhpcy5jdHguY2xpZW50cy5kYXRhU2VydmljZSBhcyBhbnkpLkV4cG9ydChyZXF1ZXN0LCBtZXRhZGF0YSk7XHJcblxyXG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgbGV0IHN0YXRzOiBFeHBvcnRTdGF0cyB8IHVuZGVmaW5lZDtcclxuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0cykge1xyXG4gICAgICAgICAgICBzdGF0cyA9IHtcclxuICAgICAgICAgICAgICBub2Rlc0V4cG9ydGVkOiBwYXJzZUludChyZXNwb25zZS5zdGF0cy5ub2Rlc19leHBvcnRlZCB8fCAnMCcsIDEwKSxcclxuICAgICAgICAgICAgICBlZGdlc0V4cG9ydGVkOiBwYXJzZUludChyZXNwb25zZS5zdGF0cy5lZGdlc19leHBvcnRlZCB8fCAnMCcsIDEwKSxcclxuICAgICAgICAgICAgICBieXRlc1dyaXR0ZW46IHBhcnNlSW50KHJlc3BvbnNlLnN0YXRzLmJ5dGVzX3dyaXR0ZW4gfHwgJzAnLCAxMCksXHJcbiAgICAgICAgICAgICAgZHVyYXRpb25NczogcGFyc2VJbnQocmVzcG9uc2Uuc3RhdHMuZHVyYXRpb25fbXMgfHwgJzAnLCAxMCksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgY2h1bms6IEV4cG9ydENodW5rID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShyZXNwb25zZS5kYXRhIHx8IFtdKSxcclxuICAgICAgICAgICAgaXNGaW5hbDogcmVzcG9uc2UuaXNfZmluYWwgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgIHN0YXRzLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjYWxsYmFjayhjaHVuayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UuaXNfZmluYWwpIHtcclxuICAgICAgICAgIHN0cmVhbS5jYW5jZWwoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiByZXNvbHZlKCkpO1xyXG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdHJlYW0gbm9kZXMgZnJvbSBhIGdyYXBoLlxyXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXHJcbiAgICovXHJcbiAgYXN5bmMgZXhwb3J0Tm9kZXMoXHJcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcclxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxyXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXHJcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydE5vZGVzUmVzdWx0KSA9PiB2b2lkXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zb2xlLndhcm4oJ2V4cG9ydE5vZGVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkJyk7XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgZ3JhcGhfbmFtZTogZ3JhcGhOYW1lLFxyXG4gICAgICBsYWJlbHM6IGxhYmVscyB8fCBbXSxcclxuICAgICAgbGltaXQ6IGxpbWl0LnRvU3RyaW5nKCksXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgc3RyZWFtID0gKHRoaXMuY3R4LmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5FeHBvcnROb2RlcyhyZXF1ZXN0LCBtZXRhZGF0YSk7XHJcblxyXG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgY2FsbGJhY2soe1xyXG4gICAgICAgICAgICBub2RlczogKHJlc3BvbnNlLm5vZGVzIHx8IFtdKS5tYXAoKG46IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICBpZDogbi5pZCB8fCAnJyxcclxuICAgICAgICAgICAgICBsYWJlbHM6IG4ubGFiZWxzIHx8IFtdLFxyXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IGNvbnZlcnRQcm90b1Byb3BlcnRpZXMobi5wcm9wZXJ0aWVzIHx8IHt9KSxcclxuICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICBoYXNNb3JlOiByZXNwb25zZS5oYXNfbW9yZSB8fCBmYWxzZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHJlc29sdmUoKSk7XHJcbiAgICAgIHN0cmVhbS5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4gcmVqZWN0KGVycm9yKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0cmVhbSBlZGdlcyBmcm9tIGEgZ3JhcGguXHJcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcclxuICAgKi9cclxuICBhc3luYyBleHBvcnRFZGdlcyhcclxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxyXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXHJcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcclxuICAgIGNhbGxiYWNrPzogKHJlc3VsdDogRXhwb3J0RWRnZXNSZXN1bHQpID0+IHZvaWRcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnNvbGUud2FybignZXhwb3J0RWRnZXMgaXMgZGVwcmVjYXRlZCwgdXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWQnKTtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICBncmFwaF9uYW1lOiBncmFwaE5hbWUsXHJcbiAgICAgIGxhYmVsczogbGFiZWxzIHx8IFtdLFxyXG4gICAgICBsaW1pdDogbGltaXQudG9TdHJpbmcoKSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBzdHJlYW0gPSAodGhpcy5jdHguY2xpZW50cy5kYXRhU2VydmljZSBhcyBhbnkpLkV4cG9ydEVkZ2VzKHJlcXVlc3QsIG1ldGFkYXRhKTtcclxuXHJcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICBjYWxsYmFjayh7XHJcbiAgICAgICAgICAgIGVkZ2VzOiAocmVzcG9uc2UuZWRnZXMgfHwgW10pLm1hcCgoZTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICAgIGlkOiBlLmlkIHx8ICcnLFxyXG4gICAgICAgICAgICAgIGxhYmVsOiBlLmxhYmVsIHx8ICcnLFxyXG4gICAgICAgICAgICAgIGZyb21Ob2RlSWQ6IGUuZnJvbV9ub2RlX2lkIHx8ICcnLFxyXG4gICAgICAgICAgICAgIHRvTm9kZUlkOiBlLnRvX25vZGVfaWQgfHwgJycsXHJcbiAgICAgICAgICAgICAgcHJvcGVydGllczogY29udmVydFByb3RvUHJvcGVydGllcyhlLnByb3BlcnRpZXMgfHwge30pLFxyXG4gICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgIGhhc01vcmU6IHJlc3BvbnNlLmhhc19tb3JlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZSgpKTtcclxuICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIChlcnJvcjogYW55KSA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Graph service handles graph management operations.
3
+ */
4
+ import { ServiceContext } from './service-context';
5
+ import { GraphInfo, GraphType } from '../types';
6
+ /**
7
+ * Graph service for managing graphs.
8
+ */
9
+ export declare class GraphService {
10
+ private ctx;
11
+ constructor(ctx: ServiceContext);
12
+ /**
13
+ * Create a new graph.
14
+ */
15
+ createGraph(name: string, graphType?: GraphType, description?: string): Promise<void>;
16
+ /**
17
+ * Delete a graph.
18
+ */
19
+ dropGraph(name: string, ifExists?: boolean): Promise<void>;
20
+ /**
21
+ * Set the current graph for the session.
22
+ */
23
+ useGraph(name: string): Promise<void>;
24
+ /**
25
+ * Return all available graphs.
26
+ */
27
+ listGraphs(): Promise<GraphInfo[]>;
28
+ /**
29
+ * Return information about a specific graph.
30
+ */
31
+ getGraphInfo(name: string): Promise<GraphInfo>;
32
+ }