@sochdb/sochdb 0.4.0 → 0.4.2
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/README.md +416 -34
- package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
- package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
- package/bin/sochdb-bulk.js +1 -1
- package/bin/sochdb-grpc-server.js +1 -1
- package/bin/sochdb-server.js +1 -1
- package/dist/cjs/context-builder.js +280 -0
- package/dist/cjs/database.js +2 -2
- package/dist/cjs/embedded/database.js +2 -2
- package/dist/cjs/embedded/ffi/hnsw-bindings.js +295 -0
- package/dist/cjs/embedded/ffi/library-finder.js +10 -3
- package/dist/cjs/embedded/index.js +5 -2
- package/dist/cjs/errors.js +99 -7
- package/dist/cjs/index.js +46 -6
- package/dist/cjs/ipc-client.js +2 -2
- package/dist/cjs/memory/consolidation.js +202 -0
- package/dist/cjs/memory/extraction.js +181 -0
- package/dist/cjs/memory/index.js +26 -0
- package/dist/cjs/memory/retrieval.js +232 -0
- package/dist/cjs/memory/types.js +69 -0
- package/dist/cjs/namespace.js +255 -0
- package/dist/cjs/queue.js +289 -0
- package/dist/cjs/semantic-cache.js +220 -0
- package/dist/esm/context-builder.js +280 -0
- package/dist/esm/database.js +2 -2
- package/dist/esm/embedded/database.js +2 -2
- package/dist/esm/embedded/ffi/hnsw-bindings.js +316 -0
- package/dist/esm/embedded/ffi/library-finder.js +10 -3
- package/dist/esm/embedded/index.js +5 -2
- package/dist/esm/errors.js +107 -7
- package/dist/esm/index.js +46 -6
- package/dist/esm/ipc-client.js +2 -2
- package/dist/esm/memory/consolidation.js +206 -0
- package/dist/esm/memory/extraction.js +185 -0
- package/dist/esm/memory/index.js +26 -0
- package/dist/esm/memory/retrieval.js +243 -0
- package/dist/esm/memory/types.js +72 -0
- package/dist/esm/namespace.js +262 -0
- package/dist/esm/queue.js +291 -0
- package/dist/esm/semantic-cache.js +223 -0
- package/dist/types/context-builder.d.ts +97 -0
- package/dist/types/context-builder.d.ts.map +1 -0
- package/dist/types/database.d.ts +1 -1
- package/dist/types/embedded/database.d.ts +1 -1
- package/dist/types/embedded/ffi/hnsw-bindings.d.ts +90 -0
- package/dist/types/embedded/ffi/hnsw-bindings.d.ts.map +1 -0
- package/dist/types/embedded/ffi/library-finder.d.ts.map +1 -1
- package/dist/types/embedded/index.d.ts +1 -0
- package/dist/types/embedded/index.d.ts.map +1 -1
- package/dist/types/errors.d.ts +57 -1
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +15 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/ipc-client.d.ts +1 -1
- package/dist/types/memory/consolidation.d.ts +66 -0
- package/dist/types/memory/consolidation.d.ts.map +1 -0
- package/dist/types/memory/extraction.d.ts +82 -0
- package/dist/types/memory/extraction.d.ts.map +1 -0
- package/dist/types/memory/index.d.ts +10 -0
- package/dist/types/memory/index.d.ts.map +1 -0
- package/dist/types/memory/retrieval.d.ts +46 -0
- package/dist/types/memory/retrieval.d.ts.map +1 -0
- package/dist/types/memory/types.d.ts +147 -0
- package/dist/types/memory/types.d.ts.map +1 -0
- package/dist/types/namespace.d.ts +129 -0
- package/dist/types/namespace.d.ts.map +1 -0
- package/dist/types/queue.d.ts +120 -0
- package/dist/types/queue.d.ts.map +1 -0
- package/dist/types/semantic-cache.d.ts +84 -0
- package/dist/types/semantic-cache.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HNSW Vector Index FFI Bindings
|
|
4
|
+
*
|
|
5
|
+
* Native vector search using HNSW (Hierarchical Navigable Small World) algorithm.
|
|
6
|
+
*
|
|
7
|
+
* @see sochdb-index/src/ffi.rs
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.HnswIndex = exports.HnswBindings = void 0;
|
|
44
|
+
const koffi = __importStar(require("koffi"));
|
|
45
|
+
const library_finder_1 = require("./library-finder");
|
|
46
|
+
// Opaque pointer type for HNSW Index
|
|
47
|
+
const HnswIndexPtr = koffi.pointer('HnswIndexPtr', koffi.opaque());
|
|
48
|
+
// Search result struct
|
|
49
|
+
const CSearchResult = koffi.struct('CSearchResult', {
|
|
50
|
+
id_lo: 'uint64',
|
|
51
|
+
id_hi: 'uint64',
|
|
52
|
+
distance: 'float'
|
|
53
|
+
});
|
|
54
|
+
class HnswBindings {
|
|
55
|
+
static instance;
|
|
56
|
+
lib;
|
|
57
|
+
// FFI functions
|
|
58
|
+
hnsw_new;
|
|
59
|
+
hnsw_free;
|
|
60
|
+
hnsw_insert;
|
|
61
|
+
hnsw_insert_batch;
|
|
62
|
+
hnsw_insert_flat;
|
|
63
|
+
hnsw_insert_batch_flat;
|
|
64
|
+
hnsw_search;
|
|
65
|
+
hnsw_search_fast;
|
|
66
|
+
hnsw_search_ultra;
|
|
67
|
+
hnsw_len;
|
|
68
|
+
hnsw_dimension;
|
|
69
|
+
hnsw_set_ef_search;
|
|
70
|
+
hnsw_get_ef_search;
|
|
71
|
+
hnsw_build_flat_cache;
|
|
72
|
+
constructor() {
|
|
73
|
+
const libraryPath = (0, library_finder_1.findLibrary)();
|
|
74
|
+
this.lib = koffi.load(libraryPath);
|
|
75
|
+
// Create a new HNSW index
|
|
76
|
+
this.hnsw_new = this.lib.func('hnsw_new', HnswIndexPtr, ['size_t', 'size_t', 'size_t']);
|
|
77
|
+
// Free an HNSW index
|
|
78
|
+
this.hnsw_free = this.lib.func('hnsw_free', 'void', [HnswIndexPtr]);
|
|
79
|
+
// Insert single vector
|
|
80
|
+
this.hnsw_insert = this.lib.func('hnsw_insert', 'int', [HnswIndexPtr, 'uint64', 'float*', 'size_t']);
|
|
81
|
+
// Insert batch of vectors
|
|
82
|
+
this.hnsw_insert_batch = this.lib.func('hnsw_insert_batch', 'int', [
|
|
83
|
+
HnswIndexPtr,
|
|
84
|
+
'uint64*',
|
|
85
|
+
'float*',
|
|
86
|
+
'size_t',
|
|
87
|
+
'size_t'
|
|
88
|
+
]);
|
|
89
|
+
// Insert single flat vector (ID as u128)
|
|
90
|
+
this.hnsw_insert_flat = this.lib.func('hnsw_insert_flat', 'int', [
|
|
91
|
+
HnswIndexPtr,
|
|
92
|
+
'uint64',
|
|
93
|
+
'uint64',
|
|
94
|
+
'float*',
|
|
95
|
+
'size_t'
|
|
96
|
+
]);
|
|
97
|
+
// Insert batch of flat vectors
|
|
98
|
+
this.hnsw_insert_batch_flat = this.lib.func('hnsw_insert_batch_flat', 'int', [
|
|
99
|
+
HnswIndexPtr,
|
|
100
|
+
'uint64*',
|
|
101
|
+
'uint64*',
|
|
102
|
+
'float*',
|
|
103
|
+
'size_t',
|
|
104
|
+
'size_t'
|
|
105
|
+
]);
|
|
106
|
+
// Search for k nearest neighbors
|
|
107
|
+
this.hnsw_search = this.lib.func('hnsw_search', 'size_t', [
|
|
108
|
+
HnswIndexPtr,
|
|
109
|
+
'float*',
|
|
110
|
+
'size_t',
|
|
111
|
+
'size_t',
|
|
112
|
+
koffi.out(koffi.array(CSearchResult, 1000)),
|
|
113
|
+
'size_t'
|
|
114
|
+
]);
|
|
115
|
+
// Fast search (lower ef_search)
|
|
116
|
+
this.hnsw_search_fast = this.lib.func('hnsw_search_fast', 'size_t', [
|
|
117
|
+
HnswIndexPtr,
|
|
118
|
+
'float*',
|
|
119
|
+
'size_t',
|
|
120
|
+
'size_t',
|
|
121
|
+
koffi.out(koffi.array(CSearchResult, 1000)),
|
|
122
|
+
'size_t'
|
|
123
|
+
]);
|
|
124
|
+
// Ultra fast search (minimal ef_search)
|
|
125
|
+
this.hnsw_search_ultra = this.lib.func('hnsw_search_ultra', 'size_t', [
|
|
126
|
+
HnswIndexPtr,
|
|
127
|
+
'float*',
|
|
128
|
+
'size_t',
|
|
129
|
+
'size_t',
|
|
130
|
+
koffi.out(koffi.array(CSearchResult, 1000)),
|
|
131
|
+
'size_t'
|
|
132
|
+
]);
|
|
133
|
+
// Get number of vectors in index
|
|
134
|
+
this.hnsw_len = this.lib.func('hnsw_len', 'size_t', [HnswIndexPtr]);
|
|
135
|
+
// Get vector dimension
|
|
136
|
+
this.hnsw_dimension = this.lib.func('hnsw_dimension', 'size_t', [HnswIndexPtr]);
|
|
137
|
+
// Set ef_search parameter
|
|
138
|
+
this.hnsw_set_ef_search = this.lib.func('hnsw_set_ef_search', 'void', [HnswIndexPtr, 'size_t']);
|
|
139
|
+
// Get ef_search parameter
|
|
140
|
+
this.hnsw_get_ef_search = this.lib.func('hnsw_get_ef_search', 'size_t', [HnswIndexPtr]);
|
|
141
|
+
// Build flat cache for faster search
|
|
142
|
+
this.hnsw_build_flat_cache = this.lib.func('hnsw_build_flat_cache', 'int', [HnswIndexPtr]);
|
|
143
|
+
}
|
|
144
|
+
static getInstance() {
|
|
145
|
+
if (!HnswBindings.instance) {
|
|
146
|
+
HnswBindings.instance = new HnswBindings();
|
|
147
|
+
}
|
|
148
|
+
return HnswBindings.instance;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.HnswBindings = HnswBindings;
|
|
152
|
+
/**
|
|
153
|
+
* High-level HNSW Index wrapper
|
|
154
|
+
*/
|
|
155
|
+
class HnswIndex {
|
|
156
|
+
ptr;
|
|
157
|
+
bindings;
|
|
158
|
+
_dimension;
|
|
159
|
+
_efSearch;
|
|
160
|
+
constructor(config) {
|
|
161
|
+
this.bindings = HnswBindings.getInstance();
|
|
162
|
+
this._dimension = config.dimension;
|
|
163
|
+
this._efSearch = config.efSearch || 100;
|
|
164
|
+
const maxConnections = config.maxConnections || 16;
|
|
165
|
+
const efConstruction = config.efConstruction || 200;
|
|
166
|
+
this.ptr = this.bindings.hnsw_new(config.dimension, maxConnections, efConstruction);
|
|
167
|
+
if (!this.ptr) {
|
|
168
|
+
throw new Error('Failed to create HNSW index');
|
|
169
|
+
}
|
|
170
|
+
// Set ef_search if provided
|
|
171
|
+
if (config.efSearch) {
|
|
172
|
+
this.bindings.hnsw_set_ef_search(this.ptr, config.efSearch);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Insert a single vector
|
|
177
|
+
*/
|
|
178
|
+
insert(id, vector) {
|
|
179
|
+
if (vector.length !== this._dimension) {
|
|
180
|
+
throw new Error(`Vector dimension mismatch: expected ${this._dimension}, got ${vector.length}`);
|
|
181
|
+
}
|
|
182
|
+
// Convert string ID to uint64 (hash or parse)
|
|
183
|
+
const numericId = this.stringToId(id);
|
|
184
|
+
const vectorArray = new Float32Array(vector);
|
|
185
|
+
const result = this.bindings.hnsw_insert(this.ptr, numericId, vectorArray, vector.length);
|
|
186
|
+
if (result !== 0) {
|
|
187
|
+
throw new Error(`Failed to insert vector: error code ${result}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Insert multiple vectors in batch (faster)
|
|
192
|
+
*/
|
|
193
|
+
insertBatch(ids, vectors) {
|
|
194
|
+
if (ids.length !== vectors.length) {
|
|
195
|
+
throw new Error('IDs and vectors length mismatch');
|
|
196
|
+
}
|
|
197
|
+
if (vectors.length === 0) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
// Validate dimensions
|
|
201
|
+
for (const vector of vectors) {
|
|
202
|
+
if (vector.length !== this._dimension) {
|
|
203
|
+
throw new Error(`Vector dimension mismatch: expected ${this._dimension}, got ${vector.length}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Convert IDs to numeric
|
|
207
|
+
const numericIds = new BigUint64Array(ids.map(id => BigInt(this.stringToId(id))));
|
|
208
|
+
// Flatten vectors
|
|
209
|
+
const flatVectors = new Float32Array(vectors.flat());
|
|
210
|
+
const result = this.bindings.hnsw_insert_batch(this.ptr, numericIds, flatVectors, vectors.length, this._dimension);
|
|
211
|
+
if (result !== 0) {
|
|
212
|
+
throw new Error(`Failed to insert batch: error code ${result}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Search for k nearest neighbors
|
|
217
|
+
*/
|
|
218
|
+
search(queryVector, k, fast = false) {
|
|
219
|
+
if (queryVector.length !== this._dimension) {
|
|
220
|
+
throw new Error(`Query vector dimension mismatch: expected ${this._dimension}, got ${queryVector.length}`);
|
|
221
|
+
}
|
|
222
|
+
const query = new Float32Array(queryVector);
|
|
223
|
+
const resultsBuffer = new Array(k);
|
|
224
|
+
const searchFn = fast ? this.bindings.hnsw_search_fast : this.bindings.hnsw_search;
|
|
225
|
+
const numResults = searchFn(this.ptr, query, queryVector.length, k, resultsBuffer, k);
|
|
226
|
+
// Convert results
|
|
227
|
+
const results = [];
|
|
228
|
+
for (let i = 0; i < numResults; i++) {
|
|
229
|
+
const result = resultsBuffer[i];
|
|
230
|
+
results.push({
|
|
231
|
+
id: this.idToString(result.id_lo, result.id_hi),
|
|
232
|
+
distance: result.distance
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return results;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Ultra-fast search with minimal ef_search
|
|
239
|
+
*/
|
|
240
|
+
searchUltra(queryVector, k) {
|
|
241
|
+
if (queryVector.length !== this._dimension) {
|
|
242
|
+
throw new Error(`Query vector dimension mismatch: expected ${this._dimension}, got ${queryVector.length}`);
|
|
243
|
+
}
|
|
244
|
+
const query = new Float32Array(queryVector);
|
|
245
|
+
const resultsBuffer = new Array(k);
|
|
246
|
+
const numResults = this.bindings.hnsw_search_ultra(this.ptr, query, queryVector.length, k, resultsBuffer, k);
|
|
247
|
+
const results = [];
|
|
248
|
+
for (let i = 0; i < numResults; i++) {
|
|
249
|
+
const result = resultsBuffer[i];
|
|
250
|
+
results.push({
|
|
251
|
+
id: this.idToString(result.id_lo, result.id_hi),
|
|
252
|
+
distance: result.distance
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
return results;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get number of vectors in index
|
|
259
|
+
*/
|
|
260
|
+
get length() {
|
|
261
|
+
return this.bindings.hnsw_len(this.ptr);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get vector dimension
|
|
265
|
+
*/
|
|
266
|
+
get dimension() {
|
|
267
|
+
return this._dimension;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Set ef_search parameter (controls search quality vs speed)
|
|
271
|
+
*/
|
|
272
|
+
set efSearch(value) {
|
|
273
|
+
this._efSearch = value;
|
|
274
|
+
this.bindings.hnsw_set_ef_search(this.ptr, value);
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get ef_search parameter
|
|
278
|
+
*/
|
|
279
|
+
get efSearch() {
|
|
280
|
+
return this.bindings.hnsw_get_ef_search(this.ptr);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Build flat cache for faster searches
|
|
284
|
+
*/
|
|
285
|
+
buildFlatCache() {
|
|
286
|
+
const result = this.bindings.hnsw_build_flat_cache(this.ptr);
|
|
287
|
+
if (result !== 0) {
|
|
288
|
+
throw new Error(`Failed to build flat cache: error code ${result}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Free native resources
|
|
293
|
+
*/
|
|
294
|
+
close() {
|
|
295
|
+
if (this.ptr) {
|
|
296
|
+
this.bindings.hnsw_free(this.ptr);
|
|
297
|
+
this.ptr = null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Helper: Convert string ID to numeric (simple hash)
|
|
301
|
+
stringToId(id) {
|
|
302
|
+
let hash = 0;
|
|
303
|
+
for (let i = 0; i < id.length; i++) {
|
|
304
|
+
hash = ((hash << 5) - hash) + id.charCodeAt(i);
|
|
305
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
306
|
+
}
|
|
307
|
+
return Math.abs(hash);
|
|
308
|
+
}
|
|
309
|
+
// Helper: Convert numeric ID back to string
|
|
310
|
+
idToString(idLo, idHi) {
|
|
311
|
+
// For now, just use the low part
|
|
312
|
+
return idLo.toString();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
exports.HnswIndex = HnswIndex;
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG5zdy1iaW5kaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9lbWJlZGRlZC9mZmkvaG5zdy1iaW5kaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw2Q0FBK0I7QUFDL0IscURBQStDO0FBRS9DLHFDQUFxQztBQUNyQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUVuRSx1QkFBdUI7QUFDdkIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7SUFDaEQsS0FBSyxFQUFFLFFBQVE7SUFDZixLQUFLLEVBQUUsUUFBUTtJQUNmLFFBQVEsRUFBRSxPQUFPO0NBQ3BCLENBQUMsQ0FBQztBQWNILE1BQWEsWUFBWTtJQUNiLE1BQU0sQ0FBQyxRQUFRLENBQWU7SUFDOUIsR0FBRyxDQUFNO0lBRWpCLGdCQUFnQjtJQUNULFFBQVEsQ0FBTTtJQUNkLFNBQVMsQ0FBTTtJQUNmLFdBQVcsQ0FBTTtJQUNqQixpQkFBaUIsQ0FBTTtJQUN2QixnQkFBZ0IsQ0FBTTtJQUN0QixzQkFBc0IsQ0FBTTtJQUM1QixXQUFXLENBQU07SUFDakIsZ0JBQWdCLENBQU07SUFDdEIsaUJBQWlCLENBQU07SUFDdkIsUUFBUSxDQUFNO0lBQ2QsY0FBYyxDQUFNO0lBQ3BCLGtCQUFrQixDQUFNO0lBQ3hCLGtCQUFrQixDQUFNO0lBQ3hCLHFCQUFxQixDQUFNO0lBRWxDO1FBQ0ksTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBVyxHQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5DLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFH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RyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsNEJBQTRCO1FBQ3BELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELDRDQUE0QztJQUNwQyxVQUFVLENBQUMsSUFBWSxFQUFFLElBQVk7UUFDekMsaUNBQWlDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDSjtBQXJORCw4QkFxTkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhOU1cgVmVjdG9yIEluZGV4IEZGSSBCaW5kaW5nc1xuICogXG4gKiBOYXRpdmUgdmVjdG9yIHNlYXJjaCB1c2luZyBITlNXIChIaWVyYXJjaGljYWwgTmF2aWdhYmxlIFNtYWxsIFdvcmxkKSBhbGdvcml0aG0uXG4gKiBcbiAqIEBzZWUgc29jaGRiLWluZGV4L3NyYy9mZmkucnNcbiAqL1xuXG5pbXBvcnQgKiBhcyBrb2ZmaSBmcm9tICdrb2ZmaSc7XG5pbXBvcnQgeyBmaW5kTGlicmFyeSB9IGZyb20gJy4vbGlicmFyeS1maW5kZXInO1xuXG4vLyBPcGFxdWUgcG9pbnRlciB0eXBlIGZvciBITlNXIEluZGV4XG5jb25zdCBIbnN3SW5kZXhQdHIgPSBrb2ZmaS5wb2ludGVyKCdIbnN3SW5kZXhQdHInLCBrb2ZmaS5vcGFxdWUoKSk7XG5cbi8vIFNlYXJjaCByZXN1bHQgc3RydWN0XG5jb25zdCBDU2VhcmNoUmVzdWx0ID0ga29mZmkuc3RydWN0KCdDU2VhcmNoUmVzdWx0Jywge1xuICAgIGlkX2xvOiAndWludDY0JyxcbiAgICBpZF9oaTogJ3VpbnQ2NCcsXG4gICAgZGlzdGFuY2U6ICdmbG9hdCdcbn0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkaXN0YW5jZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhuc3dDb25maWcge1xuICAgIGRpbWVuc2lvbjogbnVtYmVyO1xuICAgIG1heENvbm5lY3Rpb25zPzogbnVtYmVyO1xuICAgIGVmQ29uc3RydWN0aW9uPzogbnVtYmVyO1xuICAgIGVmU2VhcmNoPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgSG5zd0JpbmRpbmdzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogSG5zd0JpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG5cbiAgICAvLyBGRkkgZnVuY3Rpb25zXG4gICAgcHVibGljIGhuc3dfbmV3OiBhbnk7XG4gICAgcHVibGljIGhuc3dfZnJlZTogYW55O1xuICAgIHB1YmxpYyBobnN3X2luc2VydDogYW55O1xuICAgIHB1YmxpYyBobnN3X2luc2VydF9iYXRjaDogYW55O1xuICAgIHB1YmxpYyBobnN3X2luc2VydF9mbGF0OiBhbnk7XG4gICAgcHVibGljIGhuc3dfaW5zZXJ0X2JhdGNoX2ZsYXQ6IGFueTtcbiAgICBwdWJsaWMgaG5zd19zZWFyY2g6IGFueTtcbiAgICBwdWJsaWMgaG5zd19zZWFyY2hfZmFzdDogYW55O1xuICAgIHB1YmxpYyBobnN3X3NlYXJjaF91bHRyYTogYW55O1xuICAgIHB1YmxpYyBobnN3X2xlbjogYW55O1xuICAgIHB1YmxpYyBobnN3X2RpbWVuc2lvbjogYW55O1xuICAgIHB1YmxpYyBobnN3X3NldF9lZl9zZWFyY2g6IGFueTtcbiAgICBwdWJsaWMgaG5zd19nZXRfZWZfc2VhcmNoOiBhbnk7XG4gICAgcHVibGljIGhuc3dfYnVpbGRfZmxhdF9jYWNoZTogYW55O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgbGlicmFyeVBhdGggPSBmaW5kTGlicmFyeSgpO1xuICAgICAgICB0aGlzLmxpYiA9IGtvZmZpLmxvYWQobGlicmFyeVBhdGgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBITlNXIGluZGV4XG4gICAgICAgIHRoaXMuaG5zd19uZXcgPSB0aGlzLmxpYi5mdW5jKCdobnN3X25ldycsIEhuc3dJbmRleFB0ciwgWydzaXplX3QnLCAnc2l6ZV90JywgJ3NpemVfdCddKTtcblxuICAgICAgICAvLyBGcmVlIGFuIEhOU1cgaW5kZXhcbiAgICAgICAgdGhpcy5obnN3X2ZyZWUgPSB0aGlzLmxpYi5mdW5jKCdobnN3X2ZyZWUnLCAndm9pZCcsIFtIbnN3SW5kZXhQdHJdKTtcblxuICAgICAgICAvLyBJbnNlcnQgc2luZ2xlIHZlY3RvclxuICAgICAgICB0aGlzLmhuc3dfaW5zZXJ0ID0gdGhpcy5saWIuZnVuYygnaG5zd19pbnNlcnQnLCAnaW50JywgW0huc3dJbmRleFB0ciwgJ3VpbnQ2NCcsICdmbG9hdConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIEluc2VydCBiYXRjaCBvZiB2ZWN0b3JzXG4gICAgICAgIHRoaXMuaG5zd19pbnNlcnRfYmF0Y2ggPSB0aGlzLmxpYi5mdW5jKCdobnN3X2luc2VydF9iYXRjaCcsICdpbnQnLCBbXG4gICAgICAgICAgICBIbnN3SW5kZXhQdHIsXG4gICAgICAgICAgICAndWludDY0KicsXG4gICAgICAgICAgICAnZmxvYXQqJyxcbiAgICAgICAgICAgICdzaXplX3QnLFxuICAgICAgICAgICAgJ3NpemVfdCdcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gSW5zZXJ0IHNpbmdsZSBmbGF0IHZlY3RvciAoSUQgYXMgdTEyOClcbiAgICAgICAgdGhpcy5obnN3X2luc2VydF9mbGF0ID0gdGhpcy5saWIuZnVuYygnaG5zd19pbnNlcnRfZmxhdCcsICdpbnQnLCBbXG4gICAgICAgICAgICBIbnN3SW5kZXhQdHIsXG4gICAgICAgICAgICAndWludDY0JyxcbiAgICAgICAgICAgICd1aW50NjQnLFxuICAgICAgICAgICAgJ2Zsb2F0KicsXG4gICAgICAgICAgICAnc2l6ZV90J1xuICAgICAgICBdKTtcblxuICAgICAgICAvLyBJbnNlcnQgYmF0Y2ggb2YgZmxhdCB2ZWN0b3JzXG4gICAgICAgIHRoaXMuaG5zd19pbnNlcnRfYmF0Y2hfZmxhdCA9IHRoaXMubGliLmZ1bmMoJ2huc3dfaW5zZXJ0X2JhdGNoX2ZsYXQnLCAnaW50JywgW1xuICAgICAgICAgICAgSG5zd0luZGV4UHRyLFxuICAgICAgICAgICAgJ3VpbnQ2NConLFxuICAgICAgICAgICAgJ3VpbnQ2NConLFxuICAgICAgICAgICAgJ2Zsb2F0KicsXG4gICAgICAgICAgICAnc2l6ZV90JyxcbiAgICAgICAgICAgICdzaXplX3QnXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIFNlYXJjaCBmb3IgayBuZWFyZXN0IG5laWdoYm9yc1xuICAgICAgICB0aGlzLmhuc3dfc2VhcmNoID0gdGhpcy5saWIuZnVuYygnaG5zd19zZWFyY2gnLCAnc2l6ZV90JywgW1xuICAgICAgICAgICAgSG5zd0luZGV4UHRyLFxuICAgICAgICAgICAgJ2Zsb2F0KicsXG4gICAgICAgICAgICAnc2l6ZV90JyxcbiAgICAgICAgICAgICdzaXplX3QnLFxuICAgICAgICAgICAga29mZmkub3V0KGtvZmZpLmFycmF5KENTZWFyY2hSZXN1bHQsIDEwMDApKSxcbiAgICAgICAgICAgICdzaXplX3QnXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIEZhc3Qgc2VhcmNoIChsb3dlciBlZl9zZWFyY2gpXG4gICAgICAgIHRoaXMuaG5zd19zZWFyY2hfZmFzdCA9IHRoaXMubGliLmZ1bmMoJ2huc3dfc2VhcmNoX2Zhc3QnLCAnc2l6ZV90JywgW1xuICAgICAgICAgICAgSG5zd0luZGV4UHRyLFxuICAgICAgICAgICAgJ2Zsb2F0KicsXG4gICAgICAgICAgICAnc2l6ZV90JyxcbiAgICAgICAgICAgICdzaXplX3QnLFxuICAgICAgICAgICAga29mZmkub3V0KGtvZmZpLmFycmF5KENTZWFyY2hSZXN1bHQsIDEwMDApKSxcbiAgICAgICAgICAgICdzaXplX3QnXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIFVsdHJhIGZhc3Qgc2VhcmNoIChtaW5pbWFsIGVmX3NlYXJjaClcbiAgICAgICAgdGhpcy5obnN3X3NlYXJjaF91bHRyYSA9IHRoaXMubGliLmZ1bmMoJ2huc3dfc2VhcmNoX3VsdHJhJywgJ3NpemVfdCcsIFtcbiAgICAgICAgICAgIEhuc3dJbmRleFB0cixcbiAgICAgICAgICAgICdmbG9hdConLFxuICAgICAgICAgICAgJ3NpemVfdCcsXG4gICAgICAgICAgICAnc2l6ZV90JyxcbiAgICAgICAgICAgIGtvZmZpLm91dChrb2ZmaS5hcnJheShDU2VhcmNoUmVzdWx0LCAxMDAwKSksXG4gICAgICAgICAgICAnc2l6ZV90J1xuICAgICAgICBdKTtcblxuICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIHZlY3RvcnMgaW4gaW5kZXhcbiAgICAgICAgdGhpcy5obnN3X2xlbiA9IHRoaXMubGliLmZ1bmMoJ2huc3dfbGVuJywgJ3NpemVfdCcsIFtIbnN3SW5kZXhQdHJdKTtcblxuICAgICAgICAvLyBHZXQgdmVjdG9yIGRpbWVuc2lvblxuICAgICAgICB0aGlzLmhuc3dfZGltZW5zaW9uID0gdGhpcy5saWIuZnVuYygnaG5zd19kaW1lbnNpb24nLCAnc2l6ZV90JywgW0huc3dJbmRleFB0cl0pO1xuXG4gICAgICAgIC8vIFNldCBlZl9zZWFyY2ggcGFyYW1ldGVyXG4gICAgICAgIHRoaXMuaG5zd19zZXRfZWZfc2VhcmNoID0gdGhpcy5saWIuZnVuYygnaG5zd19zZXRfZWZfc2VhcmNoJywgJ3ZvaWQnLCBbSG5zd0luZGV4UHRyLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIEdldCBlZl9zZWFyY2ggcGFyYW1ldGVyXG4gICAgICAgIHRoaXMuaG5zd19nZXRfZWZfc2VhcmNoID0gdGhpcy5saWIuZnVuYygnaG5zd19nZXRfZWZfc2VhcmNoJywgJ3NpemVfdCcsIFtIbnN3SW5kZXhQdHJdKTtcblxuICAgICAgICAvLyBCdWlsZCBmbGF0IGNhY2hlIGZvciBmYXN0ZXIgc2VhcmNoXG4gICAgICAgIHRoaXMuaG5zd19idWlsZF9mbGF0X2NhY2hlID0gdGhpcy5saWIuZnVuYygnaG5zd19idWlsZF9mbGF0X2NhY2hlJywgJ2ludCcsIFtIbnN3SW5kZXhQdHJdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEhuc3dCaW5kaW5ncyB7XG4gICAgICAgIGlmICghSG5zd0JpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBIbnN3QmluZGluZ3MuaW5zdGFuY2UgPSBuZXcgSG5zd0JpbmRpbmdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEhuc3dCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG59XG5cbi8qKlxuICogSGlnaC1sZXZlbCBITlNXIEluZGV4IHdyYXBwZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEhuc3dJbmRleCB7XG4gICAgcHJpdmF0ZSBwdHI6IGFueTtcbiAgICBwcml2YXRlIGJpbmRpbmdzOiBIbnN3QmluZGluZ3M7XG4gICAgcHJpdmF0ZSBfZGltZW5zaW9uOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfZWZTZWFyY2g6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogSG5zd0NvbmZpZykge1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gSG5zd0JpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbiA9IGNvbmZpZy5kaW1lbnNpb247XG4gICAgICAgIHRoaXMuX2VmU2VhcmNoID0gY29uZmlnLmVmU2VhcmNoIHx8IDEwMDtcblxuICAgICAgICBjb25zdCBtYXhDb25uZWN0aW9ucyA9IGNvbmZpZy5tYXhDb25uZWN0aW9ucyB8fCAxNjtcbiAgICAgICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBjb25maWcuZWZDb25zdHJ1Y3Rpb24gfHwgMjAwO1xuXG4gICAgICAgIHRoaXMucHRyID0gdGhpcy5iaW5kaW5ncy5obnN3X25ldyhjb25maWcuZGltZW5zaW9uLCBtYXhDb25uZWN0aW9ucywgZWZDb25zdHJ1Y3Rpb24pO1xuICAgICAgICBpZiAoIXRoaXMucHRyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgSE5TVyBpbmRleCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGVmX3NlYXJjaCBpZiBwcm92aWRlZFxuICAgICAgICBpZiAoY29uZmlnLmVmU2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLmhuc3dfc2V0X2VmX3NlYXJjaCh0aGlzLnB0ciwgY29uZmlnLmVmU2VhcmNoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHNpbmdsZSB2ZWN0b3JcbiAgICAgKi9cbiAgICBpbnNlcnQoaWQ6IHN0cmluZywgdmVjdG9yOiBudW1iZXJbXSk6IHZvaWQge1xuICAgICAgICBpZiAodmVjdG9yLmxlbmd0aCAhPT0gdGhpcy5fZGltZW5zaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZlY3RvciBkaW1lbnNpb24gbWlzbWF0Y2g6IGV4cGVjdGVkICR7dGhpcy5fZGltZW5zaW9ufSwgZ290ICR7dmVjdG9yLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIElEIHRvIHVpbnQ2NCAoaGFzaCBvciBwYXJzZSlcbiAgICAgICAgY29uc3QgbnVtZXJpY0lkID0gdGhpcy5zdHJpbmdUb0lkKGlkKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHZlY3RvckFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh2ZWN0b3IpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJpbmRpbmdzLmhuc3dfaW5zZXJ0KHRoaXMucHRyLCBudW1lcmljSWQsIHZlY3RvckFycmF5LCB2ZWN0b3IubGVuZ3RoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluc2VydCB2ZWN0b3I6IGVycm9yIGNvZGUgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgbXVsdGlwbGUgdmVjdG9ycyBpbiBiYXRjaCAoZmFzdGVyKVxuICAgICAqL1xuICAgIGluc2VydEJhdGNoKGlkczogc3RyaW5nW10sIHZlY3RvcnM6IG51bWJlcltdW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlkcy5sZW5ndGggIT09IHZlY3RvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lEcyBhbmQgdmVjdG9ycyBsZW5ndGggbWlzbWF0Y2gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZGltZW5zaW9uc1xuICAgICAgICBmb3IgKGNvbnN0IHZlY3RvciBvZiB2ZWN0b3JzKSB7XG4gICAgICAgICAgICBpZiAodmVjdG9yLmxlbmd0aCAhPT0gdGhpcy5fZGltZW5zaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZWN0b3IgZGltZW5zaW9uIG1pc21hdGNoOiBleHBlY3RlZCAke3RoaXMuX2RpbWVuc2lvbn0sIGdvdCAke3ZlY3Rvci5sZW5ndGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IElEcyB0byBudW1lcmljXG4gICAgICAgIGNvbnN0IG51bWVyaWNJZHMgPSBuZXcgQmlnVWludDY0QXJyYXkoaWRzLm1hcChpZCA9PiBCaWdJbnQodGhpcy5zdHJpbmdUb0lkKGlkKSkpKTtcblxuICAgICAgICAvLyBGbGF0dGVuIHZlY3RvcnNcbiAgICAgICAgY29uc3QgZmxhdFZlY3RvcnMgPSBuZXcgRmxvYXQzMkFycmF5KHZlY3RvcnMuZmxhdCgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJpbmRpbmdzLmhuc3dfaW5zZXJ0X2JhdGNoKFxuICAgICAgICAgICAgdGhpcy5wdHIsXG4gICAgICAgICAgICBudW1lcmljSWRzLFxuICAgICAgICAgICAgZmxhdFZlY3RvcnMsXG4gICAgICAgICAgICB2ZWN0b3JzLmxlbmd0aCxcbiAgICAgICAgICAgIHRoaXMuX2RpbWVuc2lvblxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluc2VydCBiYXRjaDogZXJyb3IgY29kZSAke3Jlc3VsdH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgayBuZWFyZXN0IG5laWdoYm9yc1xuICAgICAqL1xuICAgIHNlYXJjaChxdWVyeVZlY3RvcjogbnVtYmVyW10sIGs6IG51bWJlciwgZmFzdDogYm9vbGVhbiA9IGZhbHNlKTogU2VhcmNoUmVzdWx0W10ge1xuICAgICAgICBpZiAocXVlcnlWZWN0b3IubGVuZ3RoICE9PSB0aGlzLl9kaW1lbnNpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgdmVjdG9yIGRpbWVuc2lvbiBtaXNtYXRjaDogZXhwZWN0ZWQgJHt0aGlzLl9kaW1lbnNpb259LCBnb3QgJHtxdWVyeVZlY3Rvci5sZW5ndGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBGbG9hdDMyQXJyYXkocXVlcnlWZWN0b3IpO1xuICAgICAgICBjb25zdCByZXN1bHRzQnVmZmVyID0gbmV3IEFycmF5KGspO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaEZuID0gZmFzdCA/IHRoaXMuYmluZGluZ3MuaG5zd19zZWFyY2hfZmFzdCA6IHRoaXMuYmluZGluZ3MuaG5zd19zZWFyY2g7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBudW1SZXN1bHRzID0gc2VhcmNoRm4oXG4gICAgICAgICAgICB0aGlzLnB0cixcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlWZWN0b3IubGVuZ3RoLFxuICAgICAgICAgICAgayxcbiAgICAgICAgICAgIHJlc3VsdHNCdWZmZXIsXG4gICAgICAgICAgICBrXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ29udmVydCByZXN1bHRzXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFNlYXJjaFJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUmVzdWx0czsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzQnVmZmVyW2ldO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZFRvU3RyaW5nKHJlc3VsdC5pZF9sbywgcmVzdWx0LmlkX2hpKSxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogcmVzdWx0LmRpc3RhbmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVsdHJhLWZhc3Qgc2VhcmNoIHdpdGggbWluaW1hbCBlZl9zZWFyY2hcbiAgICAgKi9cbiAgICBzZWFyY2hVbHRyYShxdWVyeVZlY3RvcjogbnVtYmVyW10sIGs6IG51bWJlcik6IFNlYXJjaFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHF1ZXJ5VmVjdG9yLmxlbmd0aCAhPT0gdGhpcy5fZGltZW5zaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IHZlY3RvciBkaW1lbnNpb24gbWlzbWF0Y2g6IGV4cGVjdGVkICR7dGhpcy5fZGltZW5zaW9ufSwgZ290ICR7cXVlcnlWZWN0b3IubGVuZ3RofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgRmxvYXQzMkFycmF5KHF1ZXJ5VmVjdG9yKTtcbiAgICAgICAgY29uc3QgcmVzdWx0c0J1ZmZlciA9IG5ldyBBcnJheShrKTtcblxuICAgICAgICBjb25zdCBudW1SZXN1bHRzID0gdGhpcy5iaW5kaW5ncy5obnN3X3NlYXJjaF91bHRyYShcbiAgICAgICAgICAgIHRoaXMucHRyLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBxdWVyeVZlY3Rvci5sZW5ndGgsXG4gICAgICAgICAgICBrLFxuICAgICAgICAgICAgcmVzdWx0c0J1ZmZlcixcbiAgICAgICAgICAgIGtcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCByZXN1bHRzOiBTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVJlc3VsdHM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c0J1ZmZlcltpXTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWRUb1N0cmluZyhyZXN1bHQuaWRfbG8sIHJlc3VsdC5pZF9oaSksXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IHJlc3VsdC5kaXN0YW5jZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbnVtYmVyIG9mIHZlY3RvcnMgaW4gaW5kZXhcbiAgICAgKi9cbiAgICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzLmhuc3dfbGVuKHRoaXMucHRyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdmVjdG9yIGRpbWVuc2lvblxuICAgICAqL1xuICAgIGdldCBkaW1lbnNpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpbWVuc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZWZfc2VhcmNoIHBhcmFtZXRlciAoY29udHJvbHMgc2VhcmNoIHF1YWxpdHkgdnMgc3BlZWQpXG4gICAgICovXG4gICAgc2V0IGVmU2VhcmNoKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZWZTZWFyY2ggPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5iaW5kaW5ncy5obnN3X3NldF9lZl9zZWFyY2godGhpcy5wdHIsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZWZfc2VhcmNoIHBhcmFtZXRlclxuICAgICAqL1xuICAgIGdldCBlZlNlYXJjaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncy5obnN3X2dldF9lZl9zZWFyY2godGhpcy5wdHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGZsYXQgY2FjaGUgZm9yIGZhc3RlciBzZWFyY2hlc1xuICAgICAqL1xuICAgIGJ1aWxkRmxhdENhY2hlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJpbmRpbmdzLmhuc3dfYnVpbGRfZmxhdF9jYWNoZSh0aGlzLnB0cik7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGJ1aWxkIGZsYXQgY2FjaGU6IGVycm9yIGNvZGUgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGcmVlIG5hdGl2ZSByZXNvdXJjZXNcbiAgICAgKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucHRyKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLmhuc3dfZnJlZSh0aGlzLnB0cik7XG4gICAgICAgICAgICB0aGlzLnB0ciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIZWxwZXI6IENvbnZlcnQgc3RyaW5nIElEIHRvIG51bWVyaWMgKHNpbXBsZSBoYXNoKVxuICAgIHByaXZhdGUgc3RyaW5nVG9JZChpZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGhhc2ggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBpZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyLWJpdCBpbnRlZ2VyXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGhhc2gpO1xuICAgIH1cblxuICAgIC8vIEhlbHBlcjogQ29udmVydCBudW1lcmljIElEIGJhY2sgdG8gc3RyaW5nXG4gICAgcHJpdmF0ZSBpZFRvU3RyaW5nKGlkTG86IGJpZ2ludCwgaWRIaTogYmlnaW50KTogc3RyaW5nIHtcbiAgICAgICAgLy8gRm9yIG5vdywganVzdCB1c2UgdGhlIGxvdyBwYXJ0XG4gICAgICAgIHJldHVybiBpZExvLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIl19
|
|
@@ -111,6 +111,12 @@ function findLibrary() {
|
|
|
111
111
|
path.resolve(process.cwd(), '_bin', target, filename),
|
|
112
112
|
path.resolve(process.cwd(), 'target', 'release', filename),
|
|
113
113
|
path.resolve(process.cwd(), '..', 'target', 'release', filename),
|
|
114
|
+
// 4. System-wide installation paths (no manual setup needed)
|
|
115
|
+
'/usr/local/lib/' + filename,
|
|
116
|
+
'/usr/lib/' + filename,
|
|
117
|
+
'/opt/homebrew/lib/' + filename, // macOS Apple Silicon
|
|
118
|
+
'/opt/local/lib/' + filename, // MacPorts
|
|
119
|
+
path.join(os.homedir(), '.sochdb', 'lib', filename), // User install
|
|
114
120
|
];
|
|
115
121
|
// Search for library
|
|
116
122
|
for (const searchPath of searchPaths) {
|
|
@@ -129,7 +135,8 @@ function findLibrary() {
|
|
|
129
135
|
}
|
|
130
136
|
}
|
|
131
137
|
throw new Error(`Could not find SochDB native library (${filename}). ` +
|
|
132
|
-
`Searched in
|
|
133
|
-
`
|
|
138
|
+
`Searched in package paths, development builds, and system locations. ` +
|
|
139
|
+
`Install with: brew install sochdb (macOS) or download from https://github.com/sochdb/sochdb/releases ` +
|
|
140
|
+
`Alternatively, set SOCHDB_LIB_PATH environment variable to library path.`);
|
|
134
141
|
}
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicmFyeS1maW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2xpYnJhcnktZmluZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrREgsa0NBeURDO0FBekdELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBRXpCOztHQUVHO0FBQ0gsU0FBUyxlQUFlO0lBQ3BCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7SUFDN0UsQ0FBQztTQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZGLENBQUM7U0FBTSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQztJQUM5RSxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0I7SUFDdkIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRS9CLElBQUksUUFBUSxLQUFLLFFBQVEsRUFB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RCxpRUFBaUU7SUFDakUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWU7UUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7UUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVsRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQ1gseUNBQXlDLFFBQVEsS0FBSztRQUN0RCxnQkFBZ0IsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtRQUMxQyxnRUFBZ0UsQ0FDbkUsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZGSSBMaWJyYXJ5IEZpbmRlclxuICogXG4gKiBMb2NhdGVzIHRoZSBTb2NoREIgbmF0aXZlIGxpYnJhcnkgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICogU2VhcmNoIG9yZGVyIG1hdGNoZXMgUHl0aG9uIFNESyBmb3IgY29uc2lzdGVuY3kuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcblxuLyoqXG4gKiBHZXQgdGhlIFJ1c3QgdGFyZ2V0IHRyaXBsZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm1cbiAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0VHJpcGxlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuICAgIGNvbnN0IGFyY2ggPSBvcy5hcmNoKCk7XG5cbiAgICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIHJldHVybiBhcmNoID09PSAnYXJtNjQnID8gJ2FhcmNoNjQtYXBwbGUtZGFyd2luJyA6ICd4ODZfNjQtYXBwbGUtZGFyd2luJztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgICAgIHJldHVybiBhcmNoID09PSAnYXJtNjQnID8gJ2FhcmNoNjQtdW5rbm93bi1saW51eC1nbnUnIDogJ3g4Nl82NC11bmtub3duLWxpbnV4LWdudSc7XG4gICAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgICByZXR1cm4gYXJjaCA9PT0gJ3g2NCcgPyAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycgOiAnaTY4Ni1wYy13aW5kb3dzLW1zdmMnO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcGxhdGZvcm06ICR7cGxhdGZvcm19LyR7YXJjaH1gKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxpYnJhcnkgZmlsZW5hbWUgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtXG4gKi9cbmZ1bmN0aW9uIGdldExpYnJhcnlGaWxlbmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gb3MucGxhdGZvcm0oKTtcblxuICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgcmV0dXJuICdsaWJzb2NoZGJfc3RvcmFnZS5keWxpYic7XG4gICAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgICAgICByZXR1cm4gJ2xpYnNvY2hkYl9zdG9yYWdlLnNvJztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICAgIHJldHVybiAnc29jaGRiX3N0b3JhZ2UuZGxsJztcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHBsYXRmb3JtOiAke3BsYXRmb3JtfWApO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeVxuICogXG4gKiBTZWFyY2ggb3JkZXI6XG4gKiAxLiBTT0NIREJfTElCX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqIDIuIEJ1bmRsZWQgbGlicmFyeSBpbiBwYWNrYWdlIChfYmluL3t0YXJnZXR9LylcbiAqIDMuIERldmVsb3BtZW50IGJ1aWxkICguLi90YXJnZXQvcmVsZWFzZSwgLi4vdGFyZ2V0L2RlYnVnKVxuICogNC4gU3lzdGVtIHBhdGhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGlicmFyeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldFRyaXBsZSgpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZ2V0TGlicmFyeUZpbGVuYW1lKCk7XG5cbiAgICAvLyAxLiBFbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZVxuICAgIGlmIChwcm9jZXNzLmVudi5TT0NIREJfTElCX1BBVEgpIHtcbiAgICAgICAgY29uc3QgZW52UGF0aCA9IHByb2Nlc3MuZW52LlNPQ0hEQl9MSUJfUEFUSDtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnZQYXRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAvLyAyLiBCdW5kbGVkIGluIHBhY2thZ2UgKGZyb20gZGlzdC9janMgb3IgZGlzdC9lc20pXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdfYmluJywgdGFyZ2V0LCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdfYmluJywgdGFyZ2V0LCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdfYmluJywgdGFyZ2V0LCBmaWxlbmFtZSksXG5cbiAgICAgICAgLy8gMy4gRGV2ZWxvcG1lbnQgcGF0aHMgLSBmcm9tIHByb2plY3Qgcm9vdFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAndGFyZ2V0JywgJ3JlbGVhc2UnLCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICd0YXJnZXQnLCAnZGVidWcnLCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICd0YXJnZXQnLCAncmVsZWFzZScsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3RhcmdldCcsICdkZWJ1ZycsIGZpbGVuYW1lKSxcblxuICAgICAgICAvLyBGcm9tIHNvY2hkYiBtb25vcmVwbyAoLi4vLi4vc29jaGRiL3RhcmdldC9yZWxlYXNlKVxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnLi4nLCAnc29jaGRiJywgJ3RhcmdldCcsICdyZWxlYXNlJywgZmlsZW5hbWUpLFxuXG4gICAgICAgIC8vIEFic29sdXRlIHBhdGhzXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnX2JpbicsIHRhcmdldCwgZmlsZW5hbWUpLFxuICAgICAgICBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3RhcmdldCcsICdyZWxlYXNlJywgZmlsZW5hbWUpLFxuICAgICAgICBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4uJywgJ3RhcmdldCcsICdyZWxlYXNlJywgZmlsZW5hbWUpLFxuICAgIF07XG5cbiAgICAvLyBTZWFyY2ggZm9yIGxpYnJhcnlcbiAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc2VhcmNoUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoc2VhcmNoUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBUcnkgc3lzdGVtIHBhdGhzIChMRF9MSUJSQVJZX1BBVEgsIERZTERfTElCUkFSWV9QQVRILCBQQVRIKVxuICAgIGNvbnN0IHN5c3RlbVBhdGhzID0gKHByb2Nlc3MuZW52LkxEX0xJQlJBUllfUEFUSCB8fFxuICAgICAgICBwcm9jZXNzLmVudi5EWUxEX0xJQlJBUllfUEFUSCB8fFxuICAgICAgICBwcm9jZXNzLmVudi5QQVRIIHx8ICcnKS5zcGxpdChwYXRoLmRlbGltaXRlcik7XG5cbiAgICBmb3IgKGNvbnN0IGRpciBvZiBzeXN0ZW1QYXRocykge1xuICAgICAgICBjb25zdCBsaWJQYXRoID0gcGF0aC5qb2luKGRpciwgZmlsZW5hbWUpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhsaWJQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShsaWJQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIFNvY2hEQiBuYXRpdmUgbGlicmFyeSAoJHtmaWxlbmFtZX0pLiBgICtcbiAgICAgICAgYFNlYXJjaGVkIGluOiAke3NlYXJjaFBhdGhzLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgYFNldCBTT0NIREJfTElCX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnVpbGQgdGhlIGxpYnJhcnkuYFxuICAgICk7XG59XG4iXX0=
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicmFyeS1maW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2xpYnJhcnktZmluZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrREgsa0NBaUVDO0FBakhELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBRXpCOztHQUVHO0FBQ0gsU0FBUyxlQUFlO0lBQ3BCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7SUFDN0UsQ0FBQztTQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZGLENBQUM7U0FBTSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQztJQUM5RSxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0I7SUFDdkIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRS9CLElBQUksUUFBUSxLQUFLLFFBQVEsRUFB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LEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRyxlQUFlO0tBQ3hFLENBQUM7SUFFRixxQkFBcUI7SUFDckIsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNMLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWU7UUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7UUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVsRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQ1gseUNBQXlDLFFBQVEsS0FBSztRQUN0RCx1RUFBdUU7UUFDdkUsdUdBQXVHO1FBQ3ZHLDBFQUEwRSxDQUM3RSxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRkZJIExpYnJhcnkgRmluZGVyXG4gKiBcbiAqIExvY2F0ZXMgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKiBTZWFyY2ggb3JkZXIgbWF0Y2hlcyBQeXRob24gU0RLIGZvciBjb25zaXN0ZW5jeS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuXG4vKipcbiAqIEdldCB0aGUgUnVzdCB0YXJnZXQgdHJpcGxlIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybVxuICovXG5mdW5jdGlvbiBnZXRUYXJnZXRUcmlwbGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IG9zLnBsYXRmb3JtKCk7XG4gICAgY29uc3QgYXJjaCA9IG9zLmFyY2goKTtcblxuICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgcmV0dXJuIGFyY2ggPT09ICdhcm02NCcgPyAnYWFyY2g2NC1hcHBsZS1kYXJ3aW4nIDogJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nO1xuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgICAgICAgcmV0dXJuIGFyY2ggPT09ICdhcm02NCcgPyAnYWFyY2g2NC11bmtub3duLWxpbnV4LWdudScgOiAneDg2XzY0LXVua25vd24tbGludXgtZ251JztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICAgIHJldHVybiBhcmNoID09PSAneDY0JyA/ICd4ODZfNjQtcGMtd2luZG93cy1tc3ZjJyA6ICdpNjg2LXBjLXdpbmRvd3MtbXN2Yyc7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwbGF0Zm9ybTogJHtwbGF0Zm9ybX0vJHthcmNofWApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbGlicmFyeSBmaWxlbmFtZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm1cbiAqL1xuZnVuY3Rpb24gZ2V0TGlicmFyeUZpbGVuYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuXG4gICAgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgICAgICByZXR1cm4gJ2xpYnNvY2hkYl9zdG9yYWdlLmR5bGliJztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgICAgIHJldHVybiAnbGlic29jaGRiX3N0b3JhZ2Uuc28nO1xuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgcmV0dXJuICdzb2NoZGJfc3RvcmFnZS5kbGwnO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcGxhdGZvcm06ICR7cGxhdGZvcm19YCk7XG59XG5cbi8qKlxuICogRmluZCB0aGUgU29jaERCIG5hdGl2ZSBsaWJyYXJ5XG4gKiBcbiAqIFNlYXJjaCBvcmRlcjpcbiAqIDEuIFNPQ0hEQl9MSUJfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICogMi4gQnVuZGxlZCBsaWJyYXJ5IGluIHBhY2thZ2UgKF9iaW4ve3RhcmdldH0vKVxuICogMy4gRGV2ZWxvcG1lbnQgYnVpbGQgKC4uL3RhcmdldC9yZWxlYXNlLCAuLi90YXJnZXQvZGVidWcpXG4gKiA0LiBTeXN0ZW0gcGF0aHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMaWJyYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0VHJpcGxlKCk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBnZXRMaWJyYXJ5RmlsZW5hbWUoKTtcblxuICAgIC8vIDEuIEVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlXG4gICAgaWYgKHByb2Nlc3MuZW52LlNPQ0hEQl9MSUJfUEFUSCkge1xuICAgICAgICBjb25zdCBlbnZQYXRoID0gcHJvY2Vzcy5lbnYuU09DSERCX0xJQl9QQVRIO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudlBhdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hQYXRoczogc3RyaW5nW10gPSBbXG4gICAgICAgIC8vIDIuIEJ1bmRsZWQgaW4gcGFja2FnZSAoZnJvbSBkaXN0L2NqcyBvciBkaXN0L2VzbSlcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ19iaW4nLCB0YXJnZXQsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ19iaW4nLCB0YXJnZXQsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ19iaW4nLCB0YXJnZXQsIGZpbGVuYW1lKSxcblxuICAgICAgICAvLyAzLiBEZXZlbG9wbWVudCBwYXRocyAtIGZyb20gcHJvamVjdCByb290XG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICd0YXJnZXQnLCAncmVsZWFzZScsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ3RhcmdldCcsICdkZWJ1ZycsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3RhcmdldCcsICdyZWxlYXNlJywgZmlsZW5hbWUpLFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAndGFyZ2V0JywgJ2RlYnVnJywgZmlsZW5hbWUpLFxuXG4gICAgICAgIC8vIEZyb20gc29jaGRiIG1vbm9yZXBvICguLi8uLi9zb2NoZGIvdGFyZ2V0L3JlbGVhc2UpXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICcuLicsICdzb2NoZGInLCAndGFyZ2V0JywgJ3JlbGVhc2UnLCBmaWxlbmFtZSksXG5cbiAgICAgICAgLy8gQWJzb2x1dGUgcGF0aHNcbiAgICAgICAgcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdfYmluJywgdGFyZ2V0LCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAndGFyZ2V0JywgJ3JlbGVhc2UnLCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi4nLCAndGFyZ2V0JywgJ3JlbGVhc2UnLCBmaWxlbmFtZSksXG5cbiAgICAgICAgLy8gNC4gU3lzdGVtLXdpZGUgaW5zdGFsbGF0aW9uIHBhdGhzIChubyBtYW51YWwgc2V0dXAgbmVlZGVkKVxuICAgICAgICAnL3Vzci9sb2NhbC9saWIvJyArIGZpbGVuYW1lLFxuICAgICAgICAnL3Vzci9saWIvJyArIGZpbGVuYW1lLFxuICAgICAgICAnL29wdC9ob21lYnJldy9saWIvJyArIGZpbGVuYW1lLCAgLy8gbWFjT1MgQXBwbGUgU2lsaWNvblxuICAgICAgICAnL29wdC9sb2NhbC9saWIvJyArIGZpbGVuYW1lLCAgICAgIC8vIE1hY1BvcnRzXG4gICAgICAgIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuc29jaGRiJywgJ2xpYicsIGZpbGVuYW1lKSwgIC8vIFVzZXIgaW5zdGFsbFxuICAgIF07XG5cbiAgICAvLyBTZWFyY2ggZm9yIGxpYnJhcnlcbiAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc2VhcmNoUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoc2VhcmNoUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBUcnkgc3lzdGVtIHBhdGhzIChMRF9MSUJSQVJZX1BBVEgsIERZTERfTElCUkFSWV9QQVRILCBQQVRIKVxuICAgIGNvbnN0IHN5c3RlbVBhdGhzID0gKHByb2Nlc3MuZW52LkxEX0xJQlJBUllfUEFUSCB8fFxuICAgICAgICBwcm9jZXNzLmVudi5EWUxEX0xJQlJBUllfUEFUSCB8fFxuICAgICAgICBwcm9jZXNzLmVudi5QQVRIIHx8ICcnKS5zcGxpdChwYXRoLmRlbGltaXRlcik7XG5cbiAgICBmb3IgKGNvbnN0IGRpciBvZiBzeXN0ZW1QYXRocykge1xuICAgICAgICBjb25zdCBsaWJQYXRoID0gcGF0aC5qb2luKGRpciwgZmlsZW5hbWUpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhsaWJQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShsaWJQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIFNvY2hEQiBuYXRpdmUgbGlicmFyeSAoJHtmaWxlbmFtZX0pLiBgICtcbiAgICAgICAgYFNlYXJjaGVkIGluIHBhY2thZ2UgcGF0aHMsIGRldmVsb3BtZW50IGJ1aWxkcywgYW5kIHN5c3RlbSBsb2NhdGlvbnMuIGAgK1xuICAgICAgICBgSW5zdGFsbCB3aXRoOiBicmV3IGluc3RhbGwgc29jaGRiIChtYWNPUykgb3IgZG93bmxvYWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc29jaGRiL3NvY2hkYi9yZWxlYXNlcyBgICtcbiAgICAgICAgYEFsdGVybmF0aXZlbHksIHNldCBTT0NIREJfTElCX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gbGlicmFyeSBwYXRoLmBcbiAgICApO1xufVxuIl19
|
|
@@ -6,9 +6,12 @@
|
|
|
6
6
|
* No server required.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.EmbeddedTransaction = exports.EmbeddedDatabase = void 0;
|
|
9
|
+
exports.HnswBindings = exports.HnswIndex = exports.EmbeddedTransaction = exports.EmbeddedDatabase = void 0;
|
|
10
10
|
var database_1 = require("./database");
|
|
11
11
|
Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return database_1.EmbeddedDatabase; } });
|
|
12
12
|
var transaction_1 = require("./transaction");
|
|
13
13
|
Object.defineProperty(exports, "EmbeddedTransaction", { enumerable: true, get: function () { return transaction_1.EmbeddedTransaction; } });
|
|
14
|
-
|
|
14
|
+
var hnsw_bindings_1 = require("./ffi/hnsw-bindings");
|
|
15
|
+
Object.defineProperty(exports, "HnswIndex", { enumerable: true, get: function () { return hnsw_bindings_1.HnswIndex; } });
|
|
16
|
+
Object.defineProperty(exports, "HnswBindings", { enumerable: true, get: function () { return hnsw_bindings_1.HnswBindings; } });
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCx1Q0FBc0U7QUFBN0QsNEdBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkNBQW9EO0FBQTNDLGtIQUFBLG1CQUFtQixPQUFBO0FBQzVCLHFEQUF3RjtBQUEvRSwwR0FBQSxTQUFTLE9BQUE7QUFBYyw2R0FBQSxZQUFZLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVtYmVkZGVkIE1vZGUgLSBGRkkgU3VwcG9ydFxuICogXG4gKiBEaXJlY3QgRkZJIGJpbmRpbmdzIHRvIFNvY2hEQiBuYXRpdmUgbGlicmFyeS5cbiAqIE5vIHNlcnZlciByZXF1aXJlZC5cbiAqL1xuXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9kYXRhYmFzZSc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5leHBvcnQgeyBIbnN3SW5kZXgsIEhuc3dDb25maWcsIEhuc3dCaW5kaW5ncywgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi9mZmkvaG5zdy1iaW5kaW5ncyc7XG4iXX0=
|
package/dist/esm/errors.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @packageDocumentation
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = void 0;
|
|
8
|
+
exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.ErrorCode = void 0;
|
|
9
9
|
// Copyright 2025 Sushanth (https://github.com/sushanthpy)
|
|
10
10
|
//
|
|
11
11
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,13 +13,40 @@ exports.DatabaseError = exports.ProtocolError = exports.TransactionError = expor
|
|
|
13
13
|
// You may obtain a copy of the License at
|
|
14
14
|
//
|
|
15
15
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
/**
|
|
17
|
+
* Error codes matching Rust error codes.
|
|
18
|
+
*/
|
|
19
|
+
var ErrorCode;
|
|
20
|
+
(function (ErrorCode) {
|
|
21
|
+
// Connection errors (1xxx)
|
|
22
|
+
ErrorCode[ErrorCode["CONNECTION_FAILED"] = 1001] = "CONNECTION_FAILED";
|
|
23
|
+
ErrorCode[ErrorCode["CONNECTION_TIMEOUT"] = 1002] = "CONNECTION_TIMEOUT";
|
|
24
|
+
ErrorCode[ErrorCode["CONNECTION_CLOSED"] = 1003] = "CONNECTION_CLOSED";
|
|
25
|
+
ErrorCode[ErrorCode["PROTOCOL_ERROR"] = 1004] = "PROTOCOL_ERROR";
|
|
26
|
+
// Transaction errors (2xxx)
|
|
27
|
+
ErrorCode[ErrorCode["TRANSACTION_ABORTED"] = 2001] = "TRANSACTION_ABORTED";
|
|
28
|
+
ErrorCode[ErrorCode["TRANSACTION_CONFLICT"] = 2002] = "TRANSACTION_CONFLICT";
|
|
29
|
+
// Internal errors (9xxx)
|
|
30
|
+
ErrorCode[ErrorCode["INTERNAL_ERROR"] = 9001] = "INTERNAL_ERROR";
|
|
31
|
+
ErrorCode[ErrorCode["STORAGE_ERROR"] = 9003] = "STORAGE_ERROR";
|
|
32
|
+
// Lock/Concurrency errors (10xxx) - v0.4.1
|
|
33
|
+
ErrorCode[ErrorCode["DATABASE_LOCKED"] = 10001] = "DATABASE_LOCKED";
|
|
34
|
+
ErrorCode[ErrorCode["LOCK_TIMEOUT"] = 10002] = "LOCK_TIMEOUT";
|
|
35
|
+
ErrorCode[ErrorCode["EPOCH_MISMATCH"] = 10003] = "EPOCH_MISMATCH";
|
|
36
|
+
ErrorCode[ErrorCode["SPLIT_BRAIN"] = 10004] = "SPLIT_BRAIN";
|
|
37
|
+
ErrorCode[ErrorCode["STALE_LOCK"] = 10005] = "STALE_LOCK";
|
|
38
|
+
})(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
|
|
16
39
|
/**
|
|
17
40
|
* Base error class for all SochDB errors.
|
|
18
41
|
*/
|
|
19
42
|
class SochDBError extends Error {
|
|
20
|
-
|
|
43
|
+
code;
|
|
44
|
+
remediation;
|
|
45
|
+
constructor(message, code = ErrorCode.INTERNAL_ERROR, remediation) {
|
|
21
46
|
super(message);
|
|
22
47
|
this.name = 'SochDBError';
|
|
48
|
+
this.code = code;
|
|
49
|
+
this.remediation = remediation;
|
|
23
50
|
Object.setPrototypeOf(this, SochDBError.prototype);
|
|
24
51
|
}
|
|
25
52
|
}
|
|
@@ -29,7 +56,7 @@ exports.SochDBError = SochDBError;
|
|
|
29
56
|
*/
|
|
30
57
|
class ConnectionError extends SochDBError {
|
|
31
58
|
constructor(message) {
|
|
32
|
-
super(message);
|
|
59
|
+
super(message, ErrorCode.CONNECTION_FAILED);
|
|
33
60
|
this.name = 'ConnectionError';
|
|
34
61
|
Object.setPrototypeOf(this, ConnectionError.prototype);
|
|
35
62
|
}
|
|
@@ -40,7 +67,7 @@ exports.ConnectionError = ConnectionError;
|
|
|
40
67
|
*/
|
|
41
68
|
class TransactionError extends SochDBError {
|
|
42
69
|
constructor(message) {
|
|
43
|
-
super(message);
|
|
70
|
+
super(message, ErrorCode.TRANSACTION_ABORTED);
|
|
44
71
|
this.name = 'TransactionError';
|
|
45
72
|
Object.setPrototypeOf(this, TransactionError.prototype);
|
|
46
73
|
}
|
|
@@ -51,7 +78,7 @@ exports.TransactionError = TransactionError;
|
|
|
51
78
|
*/
|
|
52
79
|
class ProtocolError extends SochDBError {
|
|
53
80
|
constructor(message) {
|
|
54
|
-
super(message);
|
|
81
|
+
super(message, ErrorCode.PROTOCOL_ERROR);
|
|
55
82
|
this.name = 'ProtocolError';
|
|
56
83
|
Object.setPrototypeOf(this, ProtocolError.prototype);
|
|
57
84
|
}
|
|
@@ -62,10 +89,83 @@ exports.ProtocolError = ProtocolError;
|
|
|
62
89
|
*/
|
|
63
90
|
class DatabaseError extends SochDBError {
|
|
64
91
|
constructor(message) {
|
|
65
|
-
super(message);
|
|
92
|
+
super(message, ErrorCode.STORAGE_ERROR);
|
|
66
93
|
this.name = 'DatabaseError';
|
|
67
94
|
Object.setPrototypeOf(this, DatabaseError.prototype);
|
|
68
95
|
}
|
|
69
96
|
}
|
|
70
97
|
exports.DatabaseError = DatabaseError;
|
|
71
|
-
|
|
98
|
+
// ============================================================================
|
|
99
|
+
// Lock/Concurrency Errors (v0.4.1)
|
|
100
|
+
// ============================================================================
|
|
101
|
+
/**
|
|
102
|
+
* Base class for lock-related errors.
|
|
103
|
+
*/
|
|
104
|
+
class LockError extends SochDBError {
|
|
105
|
+
constructor(message, code = ErrorCode.DATABASE_LOCKED, remediation) {
|
|
106
|
+
super(message, code, remediation);
|
|
107
|
+
this.name = 'LockError';
|
|
108
|
+
Object.setPrototypeOf(this, LockError.prototype);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.LockError = LockError;
|
|
112
|
+
/**
|
|
113
|
+
* Error thrown when database is locked by another process.
|
|
114
|
+
*/
|
|
115
|
+
class DatabaseLockedError extends LockError {
|
|
116
|
+
path;
|
|
117
|
+
holderPid;
|
|
118
|
+
constructor(path, holderPid) {
|
|
119
|
+
const msg = holderPid
|
|
120
|
+
? `Database at '${path}' is locked by process ${holderPid}`
|
|
121
|
+
: `Database at '${path}' is locked`;
|
|
122
|
+
super(msg, ErrorCode.DATABASE_LOCKED, 'Close the other process or wait for the lock to be released');
|
|
123
|
+
this.name = 'DatabaseLockedError';
|
|
124
|
+
this.path = path;
|
|
125
|
+
this.holderPid = holderPid;
|
|
126
|
+
Object.setPrototypeOf(this, DatabaseLockedError.prototype);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.DatabaseLockedError = DatabaseLockedError;
|
|
130
|
+
/**
|
|
131
|
+
* Error thrown when timed out waiting for database lock.
|
|
132
|
+
*/
|
|
133
|
+
class LockTimeoutError extends LockError {
|
|
134
|
+
path;
|
|
135
|
+
timeoutSecs;
|
|
136
|
+
constructor(path, timeoutSecs) {
|
|
137
|
+
super(`Timed out after ${timeoutSecs}s waiting for lock on '${path}'`, ErrorCode.LOCK_TIMEOUT, 'Increase timeout or check for deadlocks');
|
|
138
|
+
this.name = 'LockTimeoutError';
|
|
139
|
+
this.path = path;
|
|
140
|
+
this.timeoutSecs = timeoutSecs;
|
|
141
|
+
Object.setPrototypeOf(this, LockTimeoutError.prototype);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.LockTimeoutError = LockTimeoutError;
|
|
145
|
+
/**
|
|
146
|
+
* Error thrown when WAL epoch mismatch detected (stale writer).
|
|
147
|
+
*/
|
|
148
|
+
class EpochMismatchError extends LockError {
|
|
149
|
+
expected;
|
|
150
|
+
actual;
|
|
151
|
+
constructor(expected, actual) {
|
|
152
|
+
super(`Epoch mismatch: expected ${expected}, found ${actual}`, ErrorCode.EPOCH_MISMATCH, 'Another writer has taken over. Re-open the database.');
|
|
153
|
+
this.name = 'EpochMismatchError';
|
|
154
|
+
this.expected = expected;
|
|
155
|
+
this.actual = actual;
|
|
156
|
+
Object.setPrototypeOf(this, EpochMismatchError.prototype);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.EpochMismatchError = EpochMismatchError;
|
|
160
|
+
/**
|
|
161
|
+
* Error thrown when split-brain condition detected (multiple writers).
|
|
162
|
+
*/
|
|
163
|
+
class SplitBrainError extends LockError {
|
|
164
|
+
constructor(message = 'Split-brain detected: multiple active writers') {
|
|
165
|
+
super(message, ErrorCode.SPLIT_BRAIN, 'Stop all writers, verify data integrity, then restart with single writer');
|
|
166
|
+
this.name = 'SplitBrainError';
|
|
167
|
+
Object.setPrototypeOf(this, SplitBrainError.prototype);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.SplitBrainError = SplitBrainError;
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUgsMERBQTBEO0FBQzFELEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsbUVBQW1FO0FBQ25FLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0YsaURBQWlEO0FBRWpEOztHQUVHO0FBQ0gsSUFBWSxTQXFCWDtBQXJCRCxXQUFZLFNBQVM7SUFDbkIsMkJBQTJCO0lBQzNCLHNFQUF3QixDQUFBO0lBQ3hCLHdFQUF5QixDQUFBO0lBQ3pCLHNFQUF3QixDQUFBO0lBQ3hCLGdFQUFxQixDQUFBO0lBRXJCLDRCQUE0QjtJQUM1QiwwRUFBMEIsQ0FBQTtJQUMxQiw0RUFBMkIsQ0FBQTtJQUUzQix5QkFBeUI7SUFDekIsZ0VBQXFCLENBQUE7SUFDckIsOERBQW9CLENBQUE7SUFFcEIsMkNBQTJDO0lBQzNDLG1FQUF1QixDQUFBO0lBQ3ZCLDZEQUFvQixDQUFBO0lBQ3BCLGlFQUFzQixDQUFBO0lBQ3RCLDJEQUFtQixDQUFBO0lBQ25CLHlEQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFyQlcsU0FBUyx5QkFBVCxTQUFTLFFBcUJwQjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsS0FBSztJQUNwQixJQUFJLENBQVk7SUFDaEIsV0FBVyxDQUFVO0lBRXJDLFlBQVksT0FBZSxFQUFFLE9BQWtCLFNBQVMsQ0FBQyxjQUFjLEVBQUUsV0FBb0I7UUFDM0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JE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QyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQVZELDBDQVVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2NoREIgRXJyb3IgQ2xhc3Nlc1xuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8vIENvcHlyaWdodCAyMDI1IFN1c2hhbnRoIChodHRwczovL2dpdGh1Yi5jb20vc3VzaGFudGhweSlcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4vKipcbiAqIEVycm9yIGNvZGVzIG1hdGNoaW5nIFJ1c3QgZXJyb3IgY29kZXMuXG4gKi9cbmV4cG9ydCBlbnVtIEVycm9yQ29kZSB7XG4gIC8vIENvbm5lY3Rpb24gZXJyb3JzICgxeHh4KVxuICBDT05ORUNUSU9OX0ZBSUxFRCA9IDEwMDEsXG4gIENPTk5FQ1RJT05fVElNRU9VVCA9IDEwMDIsXG4gIENPTk5FQ1RJT05fQ0xPU0VEID0gMTAwMyxcbiAgUFJPVE9DT0xfRVJST1IgPSAxMDA0LFxuICBcbiAgLy8gVHJhbnNhY3Rpb24gZXJyb3JzICgyeHh4KVxuICBUUkFOU0FDVElPTl9BQk9SVEVEID0gMjAwMSxcbiAgVFJBTlNBQ1RJT05fQ09ORkxJQ1QgPSAyMDAyLFxuICBcbiAgLy8gSW50ZXJuYWwgZXJyb3JzICg5eHh4KVxuICBJTlRFUk5BTF9FUlJPUiA9IDkwMDEsXG4gIFNUT1JBR0VfRVJST1IgPSA5MDAzLFxuICBcbiAgLy8gTG9jay9Db25jdXJyZW5jeSBlcnJvcnMgKDEweHh4KSAtIHYwLjQuMVxuICBEQVRBQkFTRV9MT0NLRUQgPSAxMDAwMSxcbiAgTE9DS19USU1FT1VUID0gMTAwMDIsXG4gIEVQT0NIX01JU01BVENIID0gMTAwMDMsXG4gIFNQTElUX0JSQUlOID0gMTAwMDQsXG4gIFNUQUxFX0xPQ0sgPSAxMDAwNSxcbn1cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgU29jaERCIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2hEQkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVtZWRpYXRpb24/OiBzdHJpbmc7XG4gIFxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSA9IEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiwgcmVtZWRpYXRpb24/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU29jaERCRXJyb3InO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5yZW1lZGlhdGlvbiA9IHJlbWVkaWF0aW9uO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTb2NoREJFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBTb2NoREJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVycm9yQ29kZS5DT05ORUNUSU9OX0ZBSUxFRCk7XG4gICAgdGhpcy5uYW1lID0gJ0Nvbm5lY3Rpb25FcnJvcic7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIENvbm5lY3Rpb25FcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSB0cmFuc2FjdGlvbiBvcGVyYXRpb24gZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuVFJBTlNBQ1RJT05fQUJPUlRFRCk7XG4gICAgdGhpcy5uYW1lID0gJ1RyYW5zYWN0aW9uRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBUcmFuc2FjdGlvbkVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSdzIGEgcHJvdG9jb2wgZXJyb3IgaW4gSVBDIGNvbW11bmljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuUFJPVE9DT0xfRVJST1IpO1xuICAgIHRoaXMubmFtZSA9ICdQcm90b2NvbEVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgUHJvdG9jb2xFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBkYXRhYmFzZSBvcGVyYXRpb24gZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuU1RPUkFHRV9FUlJPUik7XG4gICAgdGhpcy5uYW1lID0gJ0RhdGFiYXNlRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBEYXRhYmFzZUVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTG9jay9Db25jdXJyZW5jeSBFcnJvcnMgKHYwLjQuMSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBsb2NrLXJlbGF0ZWQgZXJyb3JzLlxuICovXG5leHBvcnQgY2xhc3MgTG9ja0Vycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSA9IEVycm9yQ29kZS5EQVRBQkFTRV9MT0NLRUQsIHJlbWVkaWF0aW9uPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY29kZSwgcmVtZWRpYXRpb24pO1xuICAgIHRoaXMubmFtZSA9ICdMb2NrRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBMb2NrRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGRhdGFiYXNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUxvY2tlZEVycm9yIGV4dGVuZHMgTG9ja0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGhvbGRlclBpZD86IG51bWJlcjtcbiAgXG4gIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaG9sZGVyUGlkPzogbnVtYmVyKSB7XG4gICAgY29uc3QgbXNnID0gaG9sZGVyUGlkIFxuICAgICAgPyBgRGF0YWJhc2UgYXQgJyR7cGF0aH0nIGlzIGxvY2tlZCBieSBwcm9jZXNzICR7aG9sZGVyUGlkfWBcbiAgICAgIDogYERhdGFiYXNlIGF0ICcke3BhdGh9JyBpcyBsb2NrZWRgO1xuICAgIHN1cGVyKG1zZywgRXJyb3JDb2RlLkRBVEFCQVNFX0xPQ0tFRCwgJ0Nsb3NlIHRoZSBvdGhlciBwcm9jZXNzIG9yIHdhaXQgZm9yIHRoZSBsb2NrIHRvIGJlIHJlbGVhc2VkJyk7XG4gICAgdGhpcy5uYW1lID0gJ0RhdGFiYXNlTG9ja2VkRXJyb3InO1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5ob2xkZXJQaWQgPSBob2xkZXJQaWQ7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIERhdGFiYXNlTG9ja2VkRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRpbWVkIG91dCB3YWl0aW5nIGZvciBkYXRhYmFzZSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgTG9ja1RpbWVvdXRFcnJvciBleHRlbmRzIExvY2tFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0aW1lb3V0U2VjczogbnVtYmVyO1xuICBcbiAgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCB0aW1lb3V0U2VjczogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGltZWQgb3V0IGFmdGVyICR7dGltZW91dFNlY3N9cyB3YWl0aW5nIGZvciBsb2NrIG9uICcke3BhdGh9J2AsXG4gICAgICBFcnJvckNvZGUuTE9DS19USU1FT1VULFxuICAgICAgJ0luY3JlYXNlIHRpbWVvdXQgb3IgY2hlY2sgZm9yIGRlYWRsb2NrcydcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdMb2NrVGltZW91dEVycm9yJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMudGltZW91dFNlY3MgPSB0aW1lb3V0U2VjcztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTG9ja1RpbWVvdXRFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gV0FMIGVwb2NoIG1pc21hdGNoIGRldGVjdGVkIChzdGFsZSB3cml0ZXIpLlxuICovXG5leHBvcnQgY2xhc3MgRXBvY2hNaXNtYXRjaEVycm9yIGV4dGVuZHMgTG9ja0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGV4cGVjdGVkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBhY3R1YWw6IG51bWJlcjtcbiAgXG4gIGNvbnN0cnVjdG9yKGV4cGVjdGVkOiBudW1iZXIsIGFjdHVhbDogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgRXBvY2ggbWlzbWF0Y2g6IGV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBmb3VuZCAke2FjdHVhbH1gLFxuICAgICAgRXJyb3JDb2RlLkVQT0NIX01JU01BVENILFxuICAgICAgJ0Fub3RoZXIgd3JpdGVyIGhhcyB0YWtlbiBvdmVyLiBSZS1vcGVuIHRoZSBkYXRhYmFzZS4nXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnRXBvY2hNaXNtYXRjaEVycm9yJztcbiAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gICAgdGhpcy5hY3R1YWwgPSBhY3R1YWw7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEVwb2NoTWlzbWF0Y2hFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gc3BsaXQtYnJhaW4gY29uZGl0aW9uIGRldGVjdGVkIChtdWx0aXBsZSB3cml0ZXJzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwbGl0QnJhaW5FcnJvciBleHRlbmRzIExvY2tFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9ICdTcGxpdC1icmFpbiBkZXRlY3RlZDogbXVsdGlwbGUgYWN0aXZlIHdyaXRlcnMnKSB7XG4gICAgc3VwZXIoXG4gICAgICBtZXNzYWdlLFxuICAgICAgRXJyb3JDb2RlLlNQTElUX0JSQUlOLFxuICAgICAgJ1N0b3AgYWxsIHdyaXRlcnMsIHZlcmlmeSBkYXRhIGludGVncml0eSwgdGhlbiByZXN0YXJ0IHdpdGggc2luZ2xlIHdyaXRlcidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdTcGxpdEJyYWluRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTcGxpdEJyYWluRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuIl19
|