@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.
Files changed (57) hide show
  1. package/README.md +356 -14
  2. package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
  3. package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
  4. package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
  5. package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
  6. package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
  7. package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
  8. package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
  9. package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
  10. package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
  11. package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
  12. package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
  13. package/dist/cjs/embedded/database.js +98 -4
  14. package/dist/cjs/embedded/ffi/bindings.js +46 -8
  15. package/dist/cjs/index.js +28 -6
  16. package/dist/cjs/mcp/client.js +115 -0
  17. package/dist/cjs/mcp/index.js +28 -0
  18. package/dist/cjs/mcp/server.js +242 -0
  19. package/dist/cjs/mcp/types.js +32 -0
  20. package/dist/cjs/namespace.js +147 -19
  21. package/dist/cjs/policy/index.js +26 -0
  22. package/dist/cjs/policy/service.js +394 -0
  23. package/dist/cjs/policy/types.js +8 -0
  24. package/dist/esm/embedded/database.js +98 -4
  25. package/dist/esm/embedded/ffi/bindings.js +48 -8
  26. package/dist/esm/index.js +28 -6
  27. package/dist/esm/mcp/client.js +116 -0
  28. package/dist/esm/mcp/index.js +28 -0
  29. package/dist/esm/mcp/server.js +244 -0
  30. package/dist/esm/mcp/types.js +34 -0
  31. package/dist/esm/namespace.js +150 -19
  32. package/dist/esm/policy/index.js +26 -0
  33. package/dist/esm/policy/service.js +396 -0
  34. package/dist/esm/policy/types.js +8 -0
  35. package/dist/types/embedded/database.d.ts +66 -1
  36. package/dist/types/embedded/database.d.ts.map +1 -1
  37. package/dist/types/embedded/ffi/bindings.d.ts +7 -0
  38. package/dist/types/embedded/ffi/bindings.d.ts.map +1 -1
  39. package/dist/types/index.d.ts +23 -5
  40. package/dist/types/index.d.ts.map +1 -1
  41. package/dist/types/mcp/client.d.ts +69 -0
  42. package/dist/types/mcp/client.d.ts.map +1 -0
  43. package/dist/types/mcp/index.d.ts +9 -0
  44. package/dist/types/mcp/index.d.ts.map +1 -0
  45. package/dist/types/mcp/server.d.ts +87 -0
  46. package/dist/types/mcp/server.d.ts.map +1 -0
  47. package/dist/types/mcp/types.d.ts +124 -0
  48. package/dist/types/mcp/types.d.ts.map +1 -0
  49. package/dist/types/namespace.d.ts +13 -0
  50. package/dist/types/namespace.d.ts.map +1 -1
  51. package/dist/types/policy/index.d.ts +8 -0
  52. package/dist/types/policy/index.d.ts.map +1 -0
  53. package/dist/types/policy/service.d.ts +115 -0
  54. package/dist/types/policy/service.d.ts.map +1 -0
  55. package/dist/types/policy/types.d.ts +102 -0
  56. package/dist/types/policy/types.d.ts.map +1 -0
  57. 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;IAErB,OAAO;IAMP;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB,GAAG,gBAAgB;IA4B5E;;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
+ {"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":"AAsCA,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,GAAG,CAAM;IAGV,WAAW,EAAE,GAAG,CAAC;IACjB,uBAAuB,EAAE,GAAG,CAAC;IAC7B,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;WA2CO,WAAW,IAAI,cAAc;CAM9C"}
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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * SochDB Node.js SDK v0.4.2
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. Server Mode (gRPC/IPC) - For distributed systems:
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.2";
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, NamespacePolicy, } from './memory';
53
- export type { Entity, Relation, Assertion, RawAssertion, CanonicalFact, ExtractionResult, ExtractionSchema, ConsolidationConfig, RetrievalConfig, RetrievalResult, RetrievalResponse, NamespaceGrant, } from './memory';
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';