@sochdb/sochdb 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -14
- 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/dist/cjs/embedded/database.js +98 -4
- package/dist/cjs/embedded/ffi/bindings.js +46 -8
- package/dist/cjs/index.js +28 -6
- package/dist/cjs/mcp/client.js +115 -0
- package/dist/cjs/mcp/index.js +28 -0
- package/dist/cjs/mcp/server.js +242 -0
- package/dist/cjs/mcp/types.js +32 -0
- package/dist/cjs/namespace.js +147 -19
- package/dist/cjs/policy/index.js +26 -0
- package/dist/cjs/policy/service.js +394 -0
- package/dist/cjs/policy/types.js +8 -0
- package/dist/esm/embedded/database.js +98 -4
- package/dist/esm/embedded/ffi/bindings.js +48 -8
- package/dist/esm/index.js +28 -6
- package/dist/esm/mcp/client.js +116 -0
- package/dist/esm/mcp/index.js +28 -0
- package/dist/esm/mcp/server.js +244 -0
- package/dist/esm/mcp/types.js +34 -0
- package/dist/esm/namespace.js +150 -19
- package/dist/esm/policy/index.js +26 -0
- package/dist/esm/policy/service.js +396 -0
- package/dist/esm/policy/types.js +8 -0
- package/dist/types/embedded/database.d.ts +66 -1
- package/dist/types/embedded/database.d.ts.map +1 -1
- package/dist/types/embedded/ffi/bindings.d.ts +7 -0
- package/dist/types/embedded/ffi/bindings.d.ts.map +1 -1
- package/dist/types/index.d.ts +23 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/mcp/client.d.ts +69 -0
- package/dist/types/mcp/client.d.ts.map +1 -0
- package/dist/types/mcp/index.d.ts +9 -0
- package/dist/types/mcp/index.d.ts.map +1 -0
- package/dist/types/mcp/server.d.ts +87 -0
- package/dist/types/mcp/server.d.ts.map +1 -0
- package/dist/types/mcp/types.d.ts +124 -0
- package/dist/types/mcp/types.d.ts.map +1 -0
- package/dist/types/namespace.d.ts +13 -0
- package/dist/types/namespace.d.ts.map +1 -1
- package/dist/types/policy/index.d.ts +8 -0
- package/dist/types/policy/index.d.ts.map +1 -0
- package/dist/types/policy/service.d.ts +115 -0
- package/dist/types/policy/service.d.ts.map +1 -0
- package/dist/types/policy/types.d.ts +102 -0
- package/dist/types/policy/types.d.ts.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Policy Service Implementation
|
|
4
|
+
*
|
|
5
|
+
* Policy-based access control and namespace governance for SochDB.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PolicyService = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Policy Service for access control and governance
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { EmbeddedDatabase, PolicyService } from '@sochdb/sochdb';
|
|
15
|
+
*
|
|
16
|
+
* const db = EmbeddedDatabase.open('./mydb');
|
|
17
|
+
* const policy = new PolicyService(db);
|
|
18
|
+
*
|
|
19
|
+
* // Create a namespace policy
|
|
20
|
+
* await policy.createNamespacePolicy({
|
|
21
|
+
* namespace: 'tenant_123',
|
|
22
|
+
* rules: [{
|
|
23
|
+
* id: 'read_only',
|
|
24
|
+
* name: 'Read Only Access',
|
|
25
|
+
* effect: 'allow',
|
|
26
|
+
* principals: ['user:*'],
|
|
27
|
+
* resources: ['collection:*'],
|
|
28
|
+
* actions: ['read', 'search']
|
|
29
|
+
* }],
|
|
30
|
+
* defaultEffect: 'deny'
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // Evaluate access
|
|
34
|
+
* const result = await policy.evaluate({
|
|
35
|
+
* principal: 'user:alice',
|
|
36
|
+
* action: 'read',
|
|
37
|
+
* resource: 'collection:documents'
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
class PolicyService {
|
|
42
|
+
db;
|
|
43
|
+
prefix;
|
|
44
|
+
cache = new Map();
|
|
45
|
+
auditEnabled = true;
|
|
46
|
+
constructor(db, options) {
|
|
47
|
+
this.db = db;
|
|
48
|
+
this.prefix = Buffer.from('_policy:');
|
|
49
|
+
this.auditEnabled = options?.enableAudit ?? true;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a namespace policy
|
|
53
|
+
*/
|
|
54
|
+
async createNamespacePolicy(policy) {
|
|
55
|
+
const key = this.policyKey(policy.namespace);
|
|
56
|
+
const data = {
|
|
57
|
+
...policy,
|
|
58
|
+
createdAt: Date.now(),
|
|
59
|
+
updatedAt: Date.now(),
|
|
60
|
+
};
|
|
61
|
+
await this.db.put(key, Buffer.from(JSON.stringify(data)));
|
|
62
|
+
this.cache.set(policy.namespace, policy);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get a namespace policy
|
|
66
|
+
*/
|
|
67
|
+
async getNamespacePolicy(namespace) {
|
|
68
|
+
// Check cache first
|
|
69
|
+
if (this.cache.has(namespace)) {
|
|
70
|
+
return this.cache.get(namespace);
|
|
71
|
+
}
|
|
72
|
+
const key = this.policyKey(namespace);
|
|
73
|
+
const value = await this.db.get(key);
|
|
74
|
+
if (!value) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const policy = JSON.parse(value.toString());
|
|
78
|
+
this.cache.set(namespace, policy);
|
|
79
|
+
return policy;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Update a namespace policy
|
|
83
|
+
*/
|
|
84
|
+
async updateNamespacePolicy(namespace, updates) {
|
|
85
|
+
const existing = await this.getNamespacePolicy(namespace);
|
|
86
|
+
if (!existing) {
|
|
87
|
+
throw new Error(`Policy not found for namespace: ${namespace}`);
|
|
88
|
+
}
|
|
89
|
+
const updated = {
|
|
90
|
+
...existing,
|
|
91
|
+
...updates,
|
|
92
|
+
namespace, // Ensure namespace doesn't change
|
|
93
|
+
updatedAt: Date.now(),
|
|
94
|
+
};
|
|
95
|
+
const key = this.policyKey(namespace);
|
|
96
|
+
await this.db.put(key, Buffer.from(JSON.stringify(updated)));
|
|
97
|
+
this.cache.set(namespace, updated);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Delete a namespace policy
|
|
101
|
+
*/
|
|
102
|
+
async deleteNamespacePolicy(namespace) {
|
|
103
|
+
const key = this.policyKey(namespace);
|
|
104
|
+
await this.db.delete(key);
|
|
105
|
+
this.cache.delete(namespace);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Add a rule to a namespace policy
|
|
110
|
+
*/
|
|
111
|
+
async addRule(namespace, rule) {
|
|
112
|
+
const policy = await this.getNamespacePolicy(namespace);
|
|
113
|
+
if (!policy) {
|
|
114
|
+
throw new Error(`Policy not found for namespace: ${namespace}`);
|
|
115
|
+
}
|
|
116
|
+
// Check for duplicate rule ID
|
|
117
|
+
if (policy.rules.some(r => r.id === rule.id)) {
|
|
118
|
+
throw new Error(`Rule with id '${rule.id}' already exists`);
|
|
119
|
+
}
|
|
120
|
+
policy.rules.push(rule);
|
|
121
|
+
await this.updateNamespacePolicy(namespace, { rules: policy.rules });
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Remove a rule from a namespace policy
|
|
125
|
+
*/
|
|
126
|
+
async removeRule(namespace, ruleId) {
|
|
127
|
+
const policy = await this.getNamespacePolicy(namespace);
|
|
128
|
+
if (!policy) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
const index = policy.rules.findIndex(r => r.id === ruleId);
|
|
132
|
+
if (index === -1) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
policy.rules.splice(index, 1);
|
|
136
|
+
await this.updateNamespacePolicy(namespace, { rules: policy.rules });
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Evaluate a policy request
|
|
141
|
+
*/
|
|
142
|
+
async evaluate(request) {
|
|
143
|
+
const startTime = Date.now();
|
|
144
|
+
// Extract namespace from resource
|
|
145
|
+
const namespace = this.extractNamespace(request.resource);
|
|
146
|
+
const policy = namespace ? await this.getNamespacePolicy(namespace) : null;
|
|
147
|
+
let result;
|
|
148
|
+
if (!policy) {
|
|
149
|
+
// No policy = allow by default
|
|
150
|
+
result = {
|
|
151
|
+
allowed: true,
|
|
152
|
+
reason: 'No policy defined',
|
|
153
|
+
evaluationTime: Date.now() - startTime,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Evaluate rules in priority order
|
|
158
|
+
const sortedRules = [...policy.rules].sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
159
|
+
let matchedRule;
|
|
160
|
+
for (const rule of sortedRules) {
|
|
161
|
+
if (this.matchesRule(request, rule)) {
|
|
162
|
+
matchedRule = rule;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (matchedRule) {
|
|
167
|
+
result = {
|
|
168
|
+
allowed: matchedRule.effect === 'allow',
|
|
169
|
+
matchedRule,
|
|
170
|
+
reason: `Matched rule: ${matchedRule.name}`,
|
|
171
|
+
evaluationTime: Date.now() - startTime,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
result = {
|
|
176
|
+
allowed: policy.defaultEffect === 'allow',
|
|
177
|
+
reason: `Default effect: ${policy.defaultEffect}`,
|
|
178
|
+
evaluationTime: Date.now() - startTime,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Log audit entry
|
|
183
|
+
if (this.auditEnabled) {
|
|
184
|
+
await this.logAudit(request, result);
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Grant namespace access to a principal
|
|
190
|
+
*/
|
|
191
|
+
async grantAccess(grant) {
|
|
192
|
+
const key = this.grantKey(grant.namespace, grant.principal);
|
|
193
|
+
const data = {
|
|
194
|
+
...grant,
|
|
195
|
+
grantedAt: Date.now(),
|
|
196
|
+
};
|
|
197
|
+
await this.db.put(key, Buffer.from(JSON.stringify(data)));
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Revoke namespace access from a principal
|
|
201
|
+
*/
|
|
202
|
+
async revokeAccess(namespace, principal) {
|
|
203
|
+
const key = this.grantKey(namespace, principal);
|
|
204
|
+
await this.db.delete(key);
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if principal has permission
|
|
209
|
+
*/
|
|
210
|
+
async hasPermission(namespace, principal, permission) {
|
|
211
|
+
const key = this.grantKey(namespace, principal);
|
|
212
|
+
const value = await this.db.get(key);
|
|
213
|
+
if (!value) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
const grant = JSON.parse(value.toString());
|
|
217
|
+
// Check expiration
|
|
218
|
+
if (grant.expiresAt && Date.now() > grant.expiresAt) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
// Admin has all permissions
|
|
222
|
+
if (grant.permissions.includes('admin')) {
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
return grant.permissions.includes(permission);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* List all grants for a namespace
|
|
229
|
+
*/
|
|
230
|
+
async listGrants(namespace) {
|
|
231
|
+
const grants = [];
|
|
232
|
+
const prefix = Buffer.from(`_grant:${namespace}:`);
|
|
233
|
+
try {
|
|
234
|
+
for await (const [_, valueBuffer] of this.db.scanPrefix(prefix)) {
|
|
235
|
+
const grant = JSON.parse(valueBuffer.toString());
|
|
236
|
+
grants.push(grant);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
// Ignore scan errors
|
|
241
|
+
}
|
|
242
|
+
return grants;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get audit log entries
|
|
246
|
+
*/
|
|
247
|
+
async getAuditLog(options) {
|
|
248
|
+
const entries = [];
|
|
249
|
+
const prefix = Buffer.from('_audit:');
|
|
250
|
+
const limit = options?.limit || 100;
|
|
251
|
+
try {
|
|
252
|
+
for await (const [_, valueBuffer] of this.db.scanPrefix(prefix)) {
|
|
253
|
+
const entry = JSON.parse(valueBuffer.toString());
|
|
254
|
+
// Apply filters
|
|
255
|
+
if (options?.namespace && !entry.resource.includes(options.namespace)) {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (options?.principal && entry.principal !== options.principal) {
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
if (options?.action && entry.action !== options.action) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (options?.since && entry.timestamp < options.since) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
entries.push(entry);
|
|
268
|
+
if (entries.length >= limit) {
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
// Ignore scan errors
|
|
275
|
+
}
|
|
276
|
+
// Sort by timestamp descending
|
|
277
|
+
return entries.sort((a, b) => b.timestamp - a.timestamp);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Clear policy cache
|
|
281
|
+
*/
|
|
282
|
+
clearCache() {
|
|
283
|
+
this.cache.clear();
|
|
284
|
+
}
|
|
285
|
+
// Private methods
|
|
286
|
+
policyKey(namespace) {
|
|
287
|
+
return Buffer.concat([this.prefix, Buffer.from(`namespace:${namespace}`)]);
|
|
288
|
+
}
|
|
289
|
+
grantKey(namespace, principal) {
|
|
290
|
+
return Buffer.from(`_grant:${namespace}:${principal}`);
|
|
291
|
+
}
|
|
292
|
+
extractNamespace(resource) {
|
|
293
|
+
// Extract namespace from resource like "namespace:tenant_123:collection:docs"
|
|
294
|
+
const parts = resource.split(':');
|
|
295
|
+
if (parts.length >= 2 && parts[0] === 'namespace') {
|
|
296
|
+
return parts[1];
|
|
297
|
+
}
|
|
298
|
+
// Try to extract from collection format "collection:tenant_123:docs"
|
|
299
|
+
if (parts.length >= 2 && parts[0] === 'collection') {
|
|
300
|
+
return parts[1];
|
|
301
|
+
}
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
matchesRule(request, rule) {
|
|
305
|
+
// Check principals
|
|
306
|
+
if (!this.matchesPatterns(request.principal, rule.principals)) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
// Check resources
|
|
310
|
+
if (!this.matchesPatterns(request.resource, rule.resources)) {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
// Check actions
|
|
314
|
+
if (!this.matchesPatterns(request.action, rule.actions)) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
// Check conditions
|
|
318
|
+
if (rule.conditions && rule.conditions.length > 0) {
|
|
319
|
+
for (const condition of rule.conditions) {
|
|
320
|
+
if (!this.evaluateCondition(condition, request.context)) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
matchesPatterns(value, patterns) {
|
|
328
|
+
for (const pattern of patterns) {
|
|
329
|
+
if (this.matchesPattern(value, pattern)) {
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
matchesPattern(value, pattern) {
|
|
336
|
+
if (pattern === '*') {
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
339
|
+
if (pattern.endsWith('*')) {
|
|
340
|
+
return value.startsWith(pattern.slice(0, -1));
|
|
341
|
+
}
|
|
342
|
+
if (pattern.startsWith('*')) {
|
|
343
|
+
return value.endsWith(pattern.slice(1));
|
|
344
|
+
}
|
|
345
|
+
return value === pattern;
|
|
346
|
+
}
|
|
347
|
+
evaluateCondition(condition, context) {
|
|
348
|
+
if (!context) {
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
const value = context[condition.key];
|
|
352
|
+
if (value === undefined) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
switch (condition.operator) {
|
|
356
|
+
case 'equals':
|
|
357
|
+
return value === condition.value;
|
|
358
|
+
case 'not_equals':
|
|
359
|
+
return value !== condition.value;
|
|
360
|
+
case 'contains':
|
|
361
|
+
return String(value).includes(String(condition.value));
|
|
362
|
+
case 'starts_with':
|
|
363
|
+
return String(value).startsWith(String(condition.value));
|
|
364
|
+
case 'ends_with':
|
|
365
|
+
return String(value).endsWith(String(condition.value));
|
|
366
|
+
case 'in':
|
|
367
|
+
return Array.isArray(condition.value) && condition.value.includes(value);
|
|
368
|
+
case 'not_in':
|
|
369
|
+
return Array.isArray(condition.value) && !condition.value.includes(value);
|
|
370
|
+
case 'between':
|
|
371
|
+
if (Array.isArray(condition.value) && condition.value.length === 2) {
|
|
372
|
+
return value >= condition.value[0] && value <= condition.value[1];
|
|
373
|
+
}
|
|
374
|
+
return false;
|
|
375
|
+
default:
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
async logAudit(request, result) {
|
|
380
|
+
const entry = {
|
|
381
|
+
id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
382
|
+
timestamp: Date.now(),
|
|
383
|
+
principal: request.principal,
|
|
384
|
+
action: request.action,
|
|
385
|
+
resource: request.resource,
|
|
386
|
+
decision: result.allowed ? 'allow' : 'deny',
|
|
387
|
+
matchedRule: result.matchedRule?.id,
|
|
388
|
+
reason: result.reason,
|
|
389
|
+
context: request.context,
|
|
390
|
+
};
|
|
391
|
+
const key = Buffer.from(`_audit:${entry.timestamp}:${entry.id}`);
|
|
392
|
+
await this.db.put(key, Buffer.from(JSON.stringify(entry)));
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
exports.PolicyService = PolicyService;
|
|
396
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wb2xpY3kvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBZUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxNQUFhLGFBQWE7SUFDaEIsRUFBRSxDQUFtQjtJQUNyQixNQUFNLENBQVM7SUFDZixLQUFLLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEQsWUFBWSxHQUFHLElBQUksQ0FBQztJQUU1QixZQUFZLEVBQW9CLEVBQUUsT0FBbUM7UUFDbkUsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBdUI7UUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLE1BQU07WUFDVCxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUN0QixDQUFDO1FBRUYsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7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QUMsUUFBUSxDQUFDLE9BQXNCLEVBQUUsTUFBd0I7UUFDckUsTUFBTSxLQUFLLEdBQXFCO1lBQzlCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDOUQsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUMzQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ25DLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87U0FDekIsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztDQUNGO0FBemFELHNDQXlhQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUG9saWN5IFNlcnZpY2UgSW1wbGVtZW50YXRpb25cbiAqIFxuICogUG9saWN5LWJhc2VkIGFjY2VzcyBjb250cm9sIGFuZCBuYW1lc3BhY2UgZ292ZXJuYW5jZSBmb3IgU29jaERCLlxuICovXG5cbmltcG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UgfSBmcm9tICcuLi9lbWJlZGRlZCc7XG5pbXBvcnQge1xuICBQb2xpY3lSdWxlLFxuICBQb2xpY3lDb25kaXRpb24sXG4gIFBvbGljeUV2YWx1YXRpb24sXG4gIE5hbWVzcGFjZVBvbGljeSxcbiAgTmFtZXNwYWNlR3JhbnQsXG4gIE5hbWVzcGFjZVBlcm1pc3Npb24sXG4gIFBvbGljeVJlcXVlc3QsXG4gIFBvbGljeVNldCxcbiAgUG9saWN5QXVkaXRFbnRyeSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogUG9saWN5IFNlcnZpY2UgZm9yIGFjY2VzcyBjb250cm9sIGFuZCBnb3Zlcm5hbmNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiBjb25zdCBkYiA9IEVtYmVkZGVkRGF0YWJhc2Uub3BlbignLi9teWRiJyk7XG4gKiBjb25zdCBwb2xpY3kgPSBuZXcgUG9saWN5U2VydmljZShkYik7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIG5hbWVzcGFjZSBwb2xpY3lcbiAqIGF3YWl0IHBvbGljeS5jcmVhdGVOYW1lc3BhY2VQb2xpY3koe1xuICogICBuYW1lc3BhY2U6ICd0ZW5hbnRfMTIzJyxcbiAqICAgcnVsZXM6IFt7XG4gKiAgICAgaWQ6ICdyZWFkX29ubHknLFxuICogICAgIG5hbWU6ICdSZWFkIE9ubHkgQWNjZXNzJyxcbiAqICAgICBlZmZlY3Q6ICdhbGxvdycsXG4gKiAgICAgcHJpbmNpcGFsczogWyd1c2VyOionXSxcbiAqICAgICByZXNvdXJjZXM6IFsnY29sbGVjdGlvbjoqJ10sXG4gKiAgICAgYWN0aW9uczogWydyZWFkJywgJ3NlYXJjaCddXG4gKiAgIH1dLFxuICogICBkZWZhdWx0RWZmZWN0OiAnZGVueSdcbiAqIH0pO1xuICogXG4gKiAvLyBFdmFsdWF0ZSBhY2Nlc3NcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBvbGljeS5ldmFsdWF0ZSh7XG4gKiAgIHByaW5jaXBhbDogJ3VzZXI6YWxpY2UnLFxuICogICBhY3Rpb246ICdyZWFkJyxcbiAqICAgcmVzb3VyY2U6ICdjb2xsZWN0aW9uOmRvY3VtZW50cydcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2xpY3lTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBkYjogRW1iZWRkZWREYXRhYmFzZTtcbiAgcHJpdmF0ZSBwcmVmaXg6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSBjYWNoZTogTWFwPHN0cmluZywgTmFtZXNwYWNlUG9saWN5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBhdWRpdEVuYWJsZWQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKGRiOiBFbWJlZGRlZERhdGFiYXNlLCBvcHRpb25zPzogeyBlbmFibGVBdWRpdD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuZGIgPSBkYjtcbiAgICB0aGlzLnByZWZpeCA9IEJ1ZmZlci5mcm9tKCdfcG9saWN5OicpO1xuICAgIHRoaXMuYXVkaXRFbmFibGVkID0gb3B0aW9ucz8uZW5hYmxlQXVkaXQgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuYW1lc3BhY2UgcG9saWN5XG4gICAqL1xuICBhc3luYyBjcmVhdGVOYW1lc3BhY2VQb2xpY3kocG9saWN5OiBOYW1lc3BhY2VQb2xpY3kpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLnBvbGljeUtleShwb2xpY3kubmFtZXNwYWNlKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgLi4ucG9saWN5LFxuICAgICAgY3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgdXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgIH07XG4gICAgXG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoa2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShkYXRhKSkpO1xuICAgIHRoaXMuY2FjaGUuc2V0KHBvbGljeS5uYW1lc3BhY2UsIHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbmFtZXNwYWNlIHBvbGljeVxuICAgKi9cbiAgYXN5bmMgZ2V0TmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZTogc3RyaW5nKTogUHJvbWlzZTxOYW1lc3BhY2VQb2xpY3kgfCBudWxsPiB7XG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMobmFtZXNwYWNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KG5hbWVzcGFjZSkhO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMucG9saWN5S2V5KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmRiLmdldChrZXkpO1xuICAgIFxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBvbGljeSA9IEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSkgYXMgTmFtZXNwYWNlUG9saWN5O1xuICAgIHRoaXMuY2FjaGUuc2V0KG5hbWVzcGFjZSwgcG9saWN5KTtcbiAgICByZXR1cm4gcG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIG5hbWVzcGFjZSBwb2xpY3lcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU5hbWVzcGFjZVBvbGljeShuYW1lc3BhY2U6IHN0cmluZywgdXBkYXRlczogUGFydGlhbDxOYW1lc3BhY2VQb2xpY3k+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldE5hbWVzcGFjZVBvbGljeShuYW1lc3BhY2UpO1xuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUG9saWN5IG5vdCBmb3VuZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkID0ge1xuICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAuLi51cGRhdGVzLFxuICAgICAgbmFtZXNwYWNlLCAvLyBFbnN1cmUgbmFtZXNwYWNlIGRvZXNuJ3QgY2hhbmdlXG4gICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IHRoaXMucG9saWN5S2V5KG5hbWVzcGFjZSk7XG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoa2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh1cGRhdGVkKSkpO1xuICAgIHRoaXMuY2FjaGUuc2V0KG5hbWVzcGFjZSwgdXBkYXRlZCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgbmFtZXNwYWNlIHBvbGljeVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5wb2xpY3lLZXkobmFtZXNwYWNlKTtcbiAgICBhd2FpdCB0aGlzLmRiLmRlbGV0ZShrZXkpO1xuICAgIHRoaXMuY2FjaGUuZGVsZXRlKG5hbWVzcGFjZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcnVsZSB0byBhIG5hbWVzcGFjZSBwb2xpY3lcbiAgICovXG4gIGFzeW5jIGFkZFJ1bGUobmFtZXNwYWNlOiBzdHJpbmcsIHJ1bGU6IFBvbGljeVJ1bGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xpY3kgPSBhd2FpdCB0aGlzLmdldE5hbWVzcGFjZVBvbGljeShuYW1lc3BhY2UpO1xuICAgIGlmICghcG9saWN5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvbGljeSBub3QgZm91bmQgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2V9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBydWxlIElEXG4gICAgaWYgKHBvbGljeS5ydWxlcy5zb21lKHIgPT4gci5pZCA9PT0gcnVsZS5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUnVsZSB3aXRoIGlkICcke3J1bGUuaWR9JyBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIHBvbGljeS5ydWxlcy5wdXNoKHJ1bGUpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlTmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZSwgeyBydWxlczogcG9saWN5LnJ1bGVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHJ1bGUgZnJvbSBhIG5hbWVzcGFjZSBwb2xpY3lcbiAgICovXG4gIGFzeW5jIHJlbW92ZVJ1bGUobmFtZXNwYWNlOiBzdHJpbmcsIHJ1bGVJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcG9saWN5ID0gYXdhaXQgdGhpcy5nZXROYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlKTtcbiAgICBpZiAoIXBvbGljeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gcG9saWN5LnJ1bGVzLmZpbmRJbmRleChyID0+IHIuaWQgPT09IHJ1bGVJZCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHBvbGljeS5ydWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlTmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZSwgeyBydWxlczogcG9saWN5LnJ1bGVzIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIGEgcG9saWN5IHJlcXVlc3RcbiAgICovXG4gIGFzeW5jIGV2YWx1YXRlKHJlcXVlc3Q6IFBvbGljeVJlcXVlc3QpOiBQcm9taXNlPFBvbGljeUV2YWx1YXRpb24+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIFxuICAgIC8vIEV4dHJhY3QgbmFtZXNwYWNlIGZyb20gcmVzb3VyY2VcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLmV4dHJhY3ROYW1lc3BhY2UocmVxdWVzdC5yZXNvdXJjZSk7XG4gICAgY29uc3QgcG9saWN5ID0gbmFtZXNwYWNlID8gYXdhaXQgdGhpcy5nZXROYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlKSA6IG51bGw7XG5cbiAgICBsZXQgcmVzdWx0OiBQb2xpY3lFdmFsdWF0aW9uO1xuXG4gICAgaWYgKCFwb2xpY3kpIHtcbiAgICAgIC8vIE5vIHBvbGljeSA9IGFsbG93IGJ5IGRlZmF1bHRcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgYWxsb3dlZDogdHJ1ZSxcbiAgICAgICAgcmVhc29uOiAnTm8gcG9saWN5IGRlZmluZWQnLFxuICAgICAgICBldmFsdWF0aW9uVGltZTogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2YWx1YXRlIHJ1bGVzIGluIHByaW9yaXR5IG9yZGVyXG4gICAgICBjb25zdCBzb3J0ZWRSdWxlcyA9IFsuLi5wb2xpY3kucnVsZXNdLnNvcnQoKGEsIGIpID0+IFxuICAgICAgICAoYS5wcmlvcml0eSB8fCAwKSAtIChiLnByaW9yaXR5IHx8IDApXG4gICAgICApO1xuXG4gICAgICBsZXQgbWF0Y2hlZFJ1bGU6IFBvbGljeVJ1bGUgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBzb3J0ZWRSdWxlcykge1xuICAgICAgICBpZiAodGhpcy5tYXRjaGVzUnVsZShyZXF1ZXN0LCBydWxlKSkge1xuICAgICAgICAgIG1hdGNoZWRSdWxlID0gcnVsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hlZFJ1bGUpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgIGFsbG93ZWQ6IG1hdGNoZWRSdWxlLmVmZmVjdCA9PT0gJ2FsbG93JyxcbiAgICAgICAgICBtYXRjaGVkUnVsZSxcbiAgICAgICAgICByZWFzb246IGBNYXRjaGVkIHJ1bGU6ICR7bWF0Y2hlZFJ1bGUubmFtZX1gLFxuICAgICAgICAgIGV2YWx1YXRpb25UaW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgIGFsbG93ZWQ6IHBvbGljeS5kZWZhdWx0RWZmZWN0ID09PSAnYWxsb3cnLFxuICAgICAgICAgIHJlYXNvbjogYERlZmF1bHQgZWZmZWN0OiAke3BvbGljeS5kZWZhdWx0RWZmZWN0fWAsXG4gICAgICAgICAgZXZhbHVhdGlvblRpbWU6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9nIGF1ZGl0IGVudHJ5XG4gICAgaWYgKHRoaXMuYXVkaXRFbmFibGVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ0F1ZGl0KHJlcXVlc3QsIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBuYW1lc3BhY2UgYWNjZXNzIHRvIGEgcHJpbmNpcGFsXG4gICAqL1xuICBhc3luYyBncmFudEFjY2VzcyhncmFudDogTmFtZXNwYWNlR3JhbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdyYW50S2V5KGdyYW50Lm5hbWVzcGFjZSwgZ3JhbnQucHJpbmNpcGFsKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgLi4uZ3JhbnQsXG4gICAgICBncmFudGVkQXQ6IERhdGUubm93KCksXG4gICAgfTtcbiAgICBcbiAgICBhd2FpdCB0aGlzLmRiLnB1dChrZXksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGRhdGEpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlIG5hbWVzcGFjZSBhY2Nlc3MgZnJvbSBhIHByaW5jaXBhbFxuICAgKi9cbiAgYXN5bmMgcmV2b2tlQWNjZXNzKG5hbWVzcGFjZTogc3RyaW5nLCBwcmluY2lwYWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ3JhbnRLZXkobmFtZXNwYWNlLCBwcmluY2lwYWwpO1xuICAgIGF3YWl0IHRoaXMuZGIuZGVsZXRlKGtleSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcHJpbmNpcGFsIGhhcyBwZXJtaXNzaW9uXG4gICAqL1xuICBhc3luYyBoYXNQZXJtaXNzaW9uKFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIHByaW5jaXBhbDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb246IE5hbWVzcGFjZVBlcm1pc3Npb25cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5ncmFudEtleShuYW1lc3BhY2UsIHByaW5jaXBhbCk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmRiLmdldChrZXkpO1xuICAgIFxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBncmFudCA9IEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSkgYXMgTmFtZXNwYWNlR3JhbnQ7XG5cbiAgICAvLyBDaGVjayBleHBpcmF0aW9uXG4gICAgaWYgKGdyYW50LmV4cGlyZXNBdCAmJiBEYXRlLm5vdygpID4gZ3JhbnQuZXhwaXJlc0F0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQWRtaW4gaGFzIGFsbCBwZXJtaXNzaW9uc1xuICAgIGlmIChncmFudC5wZXJtaXNzaW9ucy5pbmNsdWRlcygnYWRtaW4nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYW50LnBlcm1pc3Npb25zLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGdyYW50cyBmb3IgYSBuYW1lc3BhY2VcbiAgICovXG4gIGFzeW5jIGxpc3RHcmFudHMobmFtZXNwYWNlOiBzdHJpbmcpOiBQcm9taXNlPE5hbWVzcGFjZUdyYW50W10+IHtcbiAgICBjb25zdCBncmFudHM6IE5hbWVzcGFjZUdyYW50W10gPSBbXTtcbiAgICBjb25zdCBwcmVmaXggPSBCdWZmZXIuZnJvbShgX2dyYW50OiR7bmFtZXNwYWNlfTpgKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IFtfLCB2YWx1ZUJ1ZmZlcl0gb2YgdGhpcy5kYi5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgY29uc3QgZ3JhbnQgPSBKU09OLnBhcnNlKHZhbHVlQnVmZmVyLnRvU3RyaW5nKCkpIGFzIE5hbWVzcGFjZUdyYW50O1xuICAgICAgICBncmFudHMucHVzaChncmFudCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBzY2FuIGVycm9yc1xuICAgIH1cblxuICAgIHJldHVybiBncmFudHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF1ZGl0IGxvZyBlbnRyaWVzXG4gICAqL1xuICBhc3luYyBnZXRBdWRpdExvZyhvcHRpb25zPzoge1xuICAgIG5hbWVzcGFjZT86IHN0cmluZztcbiAgICBwcmluY2lwYWw/OiBzdHJpbmc7XG4gICAgYWN0aW9uPzogc3RyaW5nO1xuICAgIHNpbmNlPzogbnVtYmVyO1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICB9KTogUHJvbWlzZTxQb2xpY3lBdWRpdEVudHJ5W10+IHtcbiAgICBjb25zdCBlbnRyaWVzOiBQb2xpY3lBdWRpdEVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBwcmVmaXggPSBCdWZmZXIuZnJvbSgnX2F1ZGl0OicpO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQgfHwgMTAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgW18sIHZhbHVlQnVmZmVyXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IEpTT04ucGFyc2UodmFsdWVCdWZmZXIudG9TdHJpbmcoKSkgYXMgUG9saWN5QXVkaXRFbnRyeTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFwcGx5IGZpbHRlcnNcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm5hbWVzcGFjZSAmJiAhZW50cnkucmVzb3VyY2UuaW5jbHVkZXMob3B0aW9ucy5uYW1lc3BhY2UpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW5jaXBhbCAmJiBlbnRyeS5wcmluY2lwYWwgIT09IG9wdGlvbnMucHJpbmNpcGFsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LmFjdGlvbiAmJiBlbnRyeS5hY3Rpb24gIT09IG9wdGlvbnMuYWN0aW9uKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnNpbmNlICYmIGVudHJ5LnRpbWVzdGFtcCA8IG9wdGlvbnMuc2luY2UpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPj0gbGltaXQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgc2NhbiBlcnJvcnNcbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IHRpbWVzdGFtcCBkZXNjZW5kaW5nXG4gICAgcmV0dXJuIGVudHJpZXMuc29ydCgoYSwgYikgPT4gYi50aW1lc3RhbXAgLSBhLnRpbWVzdGFtcCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgcG9saWN5IGNhY2hlXG4gICAqL1xuICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIFByaXZhdGUgbWV0aG9kc1xuXG4gIHByaXZhdGUgcG9saWN5S2V5KG5hbWVzcGFjZTogc3RyaW5nKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbdGhpcy5wcmVmaXgsIEJ1ZmZlci5mcm9tKGBuYW1lc3BhY2U6JHtuYW1lc3BhY2V9YCldKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JhbnRLZXkobmFtZXNwYWNlOiBzdHJpbmcsIHByaW5jaXBhbDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oYF9ncmFudDoke25hbWVzcGFjZX06JHtwcmluY2lwYWx9YCk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3ROYW1lc3BhY2UocmVzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIEV4dHJhY3QgbmFtZXNwYWNlIGZyb20gcmVzb3VyY2UgbGlrZSBcIm5hbWVzcGFjZTp0ZW5hbnRfMTIzOmNvbGxlY3Rpb246ZG9jc1wiXG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZS5zcGxpdCgnOicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMiAmJiBwYXJ0c1swXSA9PT0gJ25hbWVzcGFjZScpIHtcbiAgICAgIHJldHVybiBwYXJ0c1sxXTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGV4dHJhY3QgZnJvbSBjb2xsZWN0aW9uIGZvcm1hdCBcImNvbGxlY3Rpb246dGVuYW50XzEyMzpkb2NzXCJcbiAgICBpZiAocGFydHMubGVuZ3RoID49IDIgJiYgcGFydHNbMF0gPT09ICdjb2xsZWN0aW9uJykge1xuICAgICAgcmV0dXJuIHBhcnRzWzFdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbWF0Y2hlc1J1bGUocmVxdWVzdDogUG9saWN5UmVxdWVzdCwgcnVsZTogUG9saWN5UnVsZSk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIHByaW5jaXBhbHNcbiAgICBpZiAoIXRoaXMubWF0Y2hlc1BhdHRlcm5zKHJlcXVlc3QucHJpbmNpcGFsLCBydWxlLnByaW5jaXBhbHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgcmVzb3VyY2VzXG4gICAgaWYgKCF0aGlzLm1hdGNoZXNQYXR0ZXJucyhyZXF1ZXN0LnJlc291cmNlLCBydWxlLnJlc291cmNlcykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhY3Rpb25zXG4gICAgaWYgKCF0aGlzLm1hdGNoZXNQYXR0ZXJucyhyZXF1ZXN0LmFjdGlvbiwgcnVsZS5hY3Rpb25zKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGNvbmRpdGlvbnNcbiAgICBpZiAocnVsZS5jb25kaXRpb25zICYmIHJ1bGUuY29uZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBydWxlLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKGNvbmRpdGlvbiwgcmVxdWVzdC5jb250ZXh0KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaGVzUGF0dGVybnModmFsdWU6IHN0cmluZywgcGF0dGVybnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaGVzUGF0dGVybih2YWx1ZSwgcGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbWF0Y2hlc1BhdHRlcm4odmFsdWU6IHN0cmluZywgcGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhdHRlcm4gPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIGlmIChwYXR0ZXJuLmVuZHNXaXRoKCcqJykpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5zdGFydHNXaXRoKHBhdHRlcm4uc2xpY2UoMCwgLTEpKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgnKicpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZW5kc1dpdGgocGF0dGVybi5zbGljZSgxKSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB2YWx1ZSA9PT0gcGF0dGVybjtcbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGVDb25kaXRpb24oY29uZGl0aW9uOiBQb2xpY3lDb25kaXRpb24sIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBjb250ZXh0W2NvbmRpdGlvbi5rZXldO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb25kaXRpb24ub3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgJ2VxdWFscyc6XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gY29uZGl0aW9uLnZhbHVlO1xuICAgICAgY2FzZSAnbm90X2VxdWFscyc6XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gY29uZGl0aW9uLnZhbHVlO1xuICAgICAgY2FzZSAnY29udGFpbnMnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5pbmNsdWRlcyhTdHJpbmcoY29uZGl0aW9uLnZhbHVlKSk7XG4gICAgICBjYXNlICdzdGFydHNfd2l0aCc6XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpLnN0YXJ0c1dpdGgoU3RyaW5nKGNvbmRpdGlvbi52YWx1ZSkpO1xuICAgICAgY2FzZSAnZW5kc193aXRoJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkuZW5kc1dpdGgoU3RyaW5nKGNvbmRpdGlvbi52YWx1ZSkpO1xuICAgICAgY2FzZSAnaW4nOlxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb25kaXRpb24udmFsdWUpICYmIGNvbmRpdGlvbi52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICBjYXNlICdub3RfaW4nOlxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb25kaXRpb24udmFsdWUpICYmICFjb25kaXRpb24udmFsdWUuaW5jbHVkZXModmFsdWUpO1xuICAgICAgY2FzZSAnYmV0d2Vlbic6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmRpdGlvbi52YWx1ZSkgJiYgY29uZGl0aW9uLnZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA+PSBjb25kaXRpb24udmFsdWVbMF0gJiYgdmFsdWUgPD0gY29uZGl0aW9uLnZhbHVlWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvZ0F1ZGl0KHJlcXVlc3Q6IFBvbGljeVJlcXVlc3QsIHJlc3VsdDogUG9saWN5RXZhbHVhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVudHJ5OiBQb2xpY3lBdWRpdEVudHJ5ID0ge1xuICAgICAgaWQ6IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWAsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBwcmluY2lwYWw6IHJlcXVlc3QucHJpbmNpcGFsLFxuICAgICAgYWN0aW9uOiByZXF1ZXN0LmFjdGlvbixcbiAgICAgIHJlc291cmNlOiByZXF1ZXN0LnJlc291cmNlLFxuICAgICAgZGVjaXNpb246IHJlc3VsdC5hbGxvd2VkID8gJ2FsbG93JyA6ICdkZW55JyxcbiAgICAgIG1hdGNoZWRSdWxlOiByZXN1bHQubWF0Y2hlZFJ1bGU/LmlkLFxuICAgICAgcmVhc29uOiByZXN1bHQucmVhc29uLFxuICAgICAgY29udGV4dDogcmVxdWVzdC5jb250ZXh0LFxuICAgIH07XG5cbiAgICBjb25zdCBrZXkgPSBCdWZmZXIuZnJvbShgX2F1ZGl0OiR7ZW50cnkudGltZXN0YW1wfToke2VudHJ5LmlkfWApO1xuICAgIGF3YWl0IHRoaXMuZGIucHV0KGtleSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoZW50cnkpKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Policy Service Types
|
|
4
|
+
*
|
|
5
|
+
* Type definitions for policy-based access control and namespace governance.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG9saWN5L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb2xpY3kgU2VydmljZSBUeXBlc1xuICogXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciBwb2xpY3ktYmFzZWQgYWNjZXNzIGNvbnRyb2wgYW5kIG5hbWVzcGFjZSBnb3Zlcm5hbmNlLlxuICovXG5cbi8qKlxuICogUG9saWN5IHJ1bGUgZm9yIGFjY2VzcyBjb250cm9sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5UnVsZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGVmZmVjdDogJ2FsbG93JyB8ICdkZW55JztcbiAgcHJpbmNpcGFsczogc3RyaW5nW107XG4gIHJlc291cmNlczogc3RyaW5nW107XG4gIGFjdGlvbnM6IHN0cmluZ1tdO1xuICBjb25kaXRpb25zPzogUG9saWN5Q29uZGl0aW9uW107XG4gIHByaW9yaXR5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBvbGljeSBjb25kaXRpb24gZm9yIGNvbnRleHR1YWwgYWNjZXNzIGNvbnRyb2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lDb25kaXRpb24ge1xuICB0eXBlOiAndGltZScgfCAnaXAnIHwgJ21ldGFkYXRhJyB8ICdjdXN0b20nO1xuICBvcGVyYXRvcjogJ2VxdWFscycgfCAnbm90X2VxdWFscycgfCAnY29udGFpbnMnIHwgJ3N0YXJ0c193aXRoJyB8ICdlbmRzX3dpdGgnIHwgJ2luJyB8ICdub3RfaW4nIHwgJ2JldHdlZW4nO1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZXZhbHVhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lFdmFsdWF0aW9uIHtcbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgbWF0Y2hlZFJ1bGU/OiBQb2xpY3lSdWxlO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIGV2YWx1YXRpb25UaW1lOiBudW1iZXI7XG59XG5cbi8qKlxuICogTmFtZXNwYWNlIHBvbGljeSBmb3IgbXVsdGktdGVuYW50IGlzb2xhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVzcGFjZVBvbGljeSB7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBydWxlczogUG9saWN5UnVsZVtdO1xuICBkZWZhdWx0RWZmZWN0OiAnYWxsb3cnIHwgJ2RlbnknO1xuICBpbmhlcml0RnJvbT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIEFjY2VzcyBncmFudCBmb3IgbmFtZXNwYWNlLWxldmVsIHBlcm1pc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZXNwYWNlR3JhbnQge1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgcHJpbmNpcGFsOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBOYW1lc3BhY2VQZXJtaXNzaW9uW107XG4gIGV4cGlyZXNBdD86IG51bWJlcjtcbiAgZ3JhbnRlZEJ5Pzogc3RyaW5nO1xuICBncmFudGVkQXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTmFtZXNwYWNlIHBlcm1pc3Npb24gbGV2ZWxzXG4gKi9cbmV4cG9ydCB0eXBlIE5hbWVzcGFjZVBlcm1pc3Npb24gPSBcbiAgfCAncmVhZCdcbiAgfCAnd3JpdGUnXG4gIHwgJ2RlbGV0ZSdcbiAgfCAnYWRtaW4nXG4gIHwgJ2NyZWF0ZV9jb2xsZWN0aW9uJ1xuICB8ICdkZWxldGVfY29sbGVjdGlvbidcbiAgfCAnc2VhcmNoJ1xuICB8ICdtYW5hZ2VfcG9saWN5JztcblxuLyoqXG4gKiBQb2xpY3kgYWN0aW9uIHR5cGVzXG4gKi9cbmV4cG9ydCB0eXBlIFBvbGljeUFjdGlvbiA9XG4gIHwgJ2RiOnJlYWQnXG4gIHwgJ2RiOndyaXRlJ1xuICB8ICdkYjpkZWxldGUnXG4gIHwgJ2RiOnNjYW4nXG4gIHwgJ25hbWVzcGFjZTpjcmVhdGUnXG4gIHwgJ25hbWVzcGFjZTpkZWxldGUnXG4gIHwgJ25hbWVzcGFjZTpsaXN0J1xuICB8ICdjb2xsZWN0aW9uOmNyZWF0ZSdcbiAgfCAnY29sbGVjdGlvbjpkZWxldGUnXG4gIHwgJ2NvbGxlY3Rpb246aW5zZXJ0J1xuICB8ICdjb2xsZWN0aW9uOnNlYXJjaCdcbiAgfCAnY29sbGVjdGlvbjp1cGRhdGUnXG4gIHwgJ3BvbGljeTpyZWFkJ1xuICB8ICdwb2xpY3k6d3JpdGUnXG4gIHwgJ2FkbWluOionO1xuXG4vKipcbiAqIFBvbGljeSByZXF1ZXN0IGZvciBldmFsdWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5UmVxdWVzdCB7XG4gIHByaW5jaXBhbDogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgcmVzb3VyY2U6IHN0cmluZztcbiAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUG9saWN5IHNldCBjb250YWluaW5nIG11bHRpcGxlIHBvbGljaWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5U2V0IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcG9saWNpZXM6IE5hbWVzcGFjZVBvbGljeVtdO1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICB1cGRhdGVkQXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBdWRpdCBsb2cgZW50cnkgZm9yIHBvbGljeSBkZWNpc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lBdWRpdEVudHJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIHByaW5jaXBhbDogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgcmVzb3VyY2U6IHN0cmluZztcbiAgZGVjaXNpb246ICdhbGxvdycgfCAnZGVueSc7XG4gIG1hdGNoZWRSdWxlPzogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuIl19
|
|
@@ -31,15 +31,80 @@ export declare class EmbeddedDatabase {
|
|
|
31
31
|
private bindings;
|
|
32
32
|
private closed;
|
|
33
33
|
private path;
|
|
34
|
+
private concurrent;
|
|
35
|
+
private _concurrentModeFallback;
|
|
34
36
|
private constructor();
|
|
35
37
|
/**
|
|
36
|
-
* Open a database at the specified path
|
|
38
|
+
* Open a database at the specified path in standard mode
|
|
39
|
+
*
|
|
40
|
+
* For web applications with multiple processes, use `openConcurrent()` instead.
|
|
37
41
|
*
|
|
38
42
|
* @param path - Path to database directory
|
|
39
43
|
* @param config - Optional configuration
|
|
40
44
|
* @returns EmbeddedDatabase instance
|
|
41
45
|
*/
|
|
42
46
|
static open(path: string, config?: EmbeddedDatabaseConfig): EmbeddedDatabase;
|
|
47
|
+
/**
|
|
48
|
+
* Open a database in concurrent mode for multi-process web applications
|
|
49
|
+
*
|
|
50
|
+
* This mode allows multiple Node.js processes (e.g., PM2 cluster workers,
|
|
51
|
+
* multiple Express instances) to access the database simultaneously.
|
|
52
|
+
*
|
|
53
|
+
* Features:
|
|
54
|
+
* - Lock-free reads with ~100ns latency
|
|
55
|
+
* - Multi-reader, single-writer coordination
|
|
56
|
+
* - Automatic write serialization
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* import { EmbeddedDatabase } from '@sochdb/sochdb';
|
|
61
|
+
* import express from 'express';
|
|
62
|
+
*
|
|
63
|
+
* // Open in concurrent mode - multiple workers can access
|
|
64
|
+
* const db = EmbeddedDatabase.openConcurrent('./web_db');
|
|
65
|
+
*
|
|
66
|
+
* const app = express();
|
|
67
|
+
*
|
|
68
|
+
* app.get('/user/:id', async (req, res) => {
|
|
69
|
+
* // Multiple concurrent requests can read simultaneously
|
|
70
|
+
* const data = await db.get(Buffer.from(`user:${req.params.id}`));
|
|
71
|
+
* if (!data) {
|
|
72
|
+
* res.status(404).json({ error: 'not found' });
|
|
73
|
+
* return;
|
|
74
|
+
* }
|
|
75
|
+
* res.send(data);
|
|
76
|
+
* });
|
|
77
|
+
*
|
|
78
|
+
* app.post('/user/:id', async (req, res) => {
|
|
79
|
+
* // Writes are serialized automatically
|
|
80
|
+
* await db.put(Buffer.from(`user:${req.params.id}`), req.body);
|
|
81
|
+
* res.json({ status: 'ok' });
|
|
82
|
+
* });
|
|
83
|
+
*
|
|
84
|
+
* // Start with PM2 cluster mode:
|
|
85
|
+
* // pm2 start app.js -i max
|
|
86
|
+
* app.listen(3000);
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* @param path - Path to database directory
|
|
90
|
+
* @param options - Optional configuration for concurrent mode
|
|
91
|
+
* @returns EmbeddedDatabase instance in concurrent mode
|
|
92
|
+
*/
|
|
93
|
+
static openConcurrent(path: string, options?: {
|
|
94
|
+
fallbackToStandard?: boolean;
|
|
95
|
+
}): EmbeddedDatabase;
|
|
96
|
+
/**
|
|
97
|
+
* Check if database is opened in concurrent mode
|
|
98
|
+
*/
|
|
99
|
+
get isConcurrent(): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Check if concurrent mode fell back to standard mode
|
|
102
|
+
*/
|
|
103
|
+
get isConcurrentFallback(): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Check if concurrent mode is available in the native library
|
|
106
|
+
*/
|
|
107
|
+
static isConcurrentModeAvailable(): boolean;
|
|
43
108
|
/**
|
|
44
109
|
* Put a key-value pair (auto-transaction)
|
|
45
110
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/embedded/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,WAAW,sBAAsB;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAAC;CACnF;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/embedded/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,WAAW,sBAAsB;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAAC;CACnF;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,uBAAuB,CAAS;IAExC,OAAO;IAQP;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB,GAAG,gBAAgB;IA4B5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,gBAAgB;IAgCjG;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,OAAO,CAElC;IAED;;OAEG;IACH,MAAM,CAAC,yBAAyB,IAAI,OAAO;IAI3C;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc9C;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAcnD;;OAEG;IACI,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAenE;;OAEG;IACH,WAAW,IAAI,mBAAmB;IAOlC;;OAEG;IACG,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYlF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAMnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QACnB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;KAC7B,CAAC;IAiBF;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,UAAU;IAMlB;;;OAGG;IACH,SAAS,IAAI,GAAG;IAIhB;;;OAGG;IACH,WAAW,IAAI,cAAc;CAGhC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
export declare class NativeBindings {
|
|
2
2
|
private static instance;
|
|
3
3
|
private lib;
|
|
4
|
+
private _concurrentModeAvailable;
|
|
4
5
|
sochdb_open: any;
|
|
5
6
|
sochdb_open_with_config: any;
|
|
7
|
+
sochdb_open_concurrent: any;
|
|
8
|
+
sochdb_is_concurrent: any;
|
|
6
9
|
sochdb_close: any;
|
|
7
10
|
sochdb_begin_txn: any;
|
|
8
11
|
sochdb_commit: any;
|
|
@@ -20,5 +23,9 @@ export declare class NativeBindings {
|
|
|
20
23
|
sochdb_free_bytes: any;
|
|
21
24
|
private constructor();
|
|
22
25
|
static getInstance(): NativeBindings;
|
|
26
|
+
/**
|
|
27
|
+
* Check if concurrent mode is available in the native library
|
|
28
|
+
*/
|
|
29
|
+
isConcurrentModeAvailable(): boolean;
|
|
23
30
|
}
|
|
24
31
|
//# sourceMappingURL=bindings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../../../src/embedded/ffi/bindings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../../../src/embedded/ffi/bindings.ts"],"names":[],"mappings":"AAyDA,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,wBAAwB,CAAS;IAGlC,WAAW,EAAE,GAAG,CAAC;IACjB,uBAAuB,EAAE,GAAG,CAAC;IAC7B,sBAAsB,EAAE,GAAG,CAAC;IAC5B,oBAAoB,EAAE,GAAG,CAAC;IAC1B,YAAY,EAAE,GAAG,CAAC;IAGlB,gBAAgB,EAAE,GAAG,CAAC;IACtB,aAAa,EAAE,GAAG,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAIlB,UAAU,EAAE,GAAG,CAAC;IAEhB,UAAU,EAAE,GAAG,CAAC;IAEhB,aAAa,EAAE,GAAG,CAAC;IAGnB,eAAe,EAAE,GAAG,CAAC;IACrB,eAAe,EAAE,GAAG,CAAC;IAGrB,kBAAkB,EAAE,GAAG,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,qBAAqB,EAAE,GAAG,CAAC;IAG3B,YAAY,EAAE,GAAG,CAAC;IAClB,iBAAiB,EAAE,GAAG,CAAC;IAGvB,iBAAiB,EAAE,GAAG,CAAC;IAE9B,OAAO;WAwDO,WAAW,IAAI,cAAc;IAO3C;;OAEG;IACI,yBAAyB,IAAI,OAAO;CAG9C"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SochDB Node.js SDK v0.4.
|
|
2
|
+
* SochDB Node.js SDK v0.4.4
|
|
3
3
|
*
|
|
4
4
|
* Dual-mode architecture: Embedded (FFI) + Server (gRPC/IPC)
|
|
5
5
|
*
|
|
@@ -12,7 +12,12 @@
|
|
|
12
12
|
* - No server required - just npm install and run
|
|
13
13
|
* - Best for: Local development, simple apps
|
|
14
14
|
*
|
|
15
|
-
* 2.
|
|
15
|
+
* 2. Concurrent Mode (FFI) - For multi-process apps:
|
|
16
|
+
* - Same FFI bindings with MVCC for concurrent access
|
|
17
|
+
* - Multiple Node.js processes can access same database
|
|
18
|
+
* - Best for: PM2 cluster, Express workers
|
|
19
|
+
*
|
|
20
|
+
* 3. Server Mode (gRPC/IPC) - For distributed systems:
|
|
16
21
|
* - Thin client connecting to sochdb-grpc server
|
|
17
22
|
* - Best for: Production, multi-language, scalability
|
|
18
23
|
*
|
|
@@ -26,6 +31,15 @@
|
|
|
26
31
|
* await db.close();
|
|
27
32
|
* ```
|
|
28
33
|
*
|
|
34
|
+
* @example Concurrent Mode
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { Database } from '@sochdb/sochdb';
|
|
37
|
+
*
|
|
38
|
+
* // Multiple processes can access simultaneously
|
|
39
|
+
* const db = Database.openConcurrent('./mydb');
|
|
40
|
+
* console.log(`Concurrent: ${db.isConcurrent}`);
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
29
43
|
* @example Server Mode
|
|
30
44
|
* ```typescript
|
|
31
45
|
* import { SochDBClient } from '@sochdb/sochdb';
|
|
@@ -35,7 +49,7 @@
|
|
|
35
49
|
* await client.putKv('key', Buffer.from('value'));
|
|
36
50
|
* ```
|
|
37
51
|
*/
|
|
38
|
-
export declare const VERSION = "0.4.
|
|
52
|
+
export declare const VERSION = "0.4.4";
|
|
39
53
|
export { EmbeddedDatabase, EmbeddedDatabaseConfig } from './embedded';
|
|
40
54
|
export { EmbeddedTransaction } from './embedded';
|
|
41
55
|
export { HnswIndex, HnswConfig, HnswBindings } from './embedded';
|
|
@@ -49,8 +63,12 @@ export { SemanticCache, } from './semantic-cache';
|
|
|
49
63
|
export type { CacheEntry, CacheHit, CacheStats, } from './semantic-cache';
|
|
50
64
|
export { ContextQueryBuilder, ContextOutputFormat, TruncationStrategy, createContextBuilder, } from './context-builder';
|
|
51
65
|
export type { ContextResult, } from './context-builder';
|
|
52
|
-
export { ExtractionPipeline, Consolidator, HybridRetriever, AllowedSet,
|
|
53
|
-
export type { Entity, Relation, Assertion, RawAssertion, CanonicalFact, ExtractionResult, ExtractionSchema, ConsolidationConfig, RetrievalConfig, RetrievalResult, RetrievalResponse,
|
|
66
|
+
export { ExtractionPipeline, Consolidator, HybridRetriever, AllowedSet, } from './memory';
|
|
67
|
+
export type { Entity, Relation, Assertion, RawAssertion, CanonicalFact, ExtractionResult, ExtractionSchema, ConsolidationConfig, RetrievalConfig, RetrievalResult, RetrievalResponse, } from './memory';
|
|
68
|
+
export { McpServer, McpClient, McpError, MCP_ERROR_CODES, } from './mcp';
|
|
69
|
+
export type { McpTool, McpToolCall, McpToolResult, McpResource, McpResourceContent, McpPrompt, McpPromptArgument, McpPromptMessage, McpServerCapabilities, McpServerConfig, McpClientConfig, McpTransport, } from './mcp';
|
|
70
|
+
export { PolicyService, } from './policy';
|
|
71
|
+
export type { PolicyRule, PolicyCondition, PolicyEvaluation, NamespacePolicy, NamespaceGrant, NamespacePermission, PolicyAction, PolicyRequest, PolicySet, PolicyAuditEntry, } from './policy';
|
|
54
72
|
export { SochDBClient } from './grpc-client';
|
|
55
73
|
export type { SearchResult, Document, GraphNode, GraphEdge, } from './grpc-client';
|
|
56
74
|
export { IpcClient } from './ipc-client';
|