dominus-sdk-nodejs 1.1.8 → 1.2.1
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/dist/index.d.ts +86 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +103 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/cache.d.ts +112 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +237 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +42 -26
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/crypto.d.ts +70 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +95 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/namespaces/secure.d.ts +102 -0
- package/dist/namespaces/secure.d.ts.map +1 -0
- package/dist/namespaces/secure.js +151 -0
- package/dist/namespaces/secure.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,14 +6,24 @@
|
|
|
6
6
|
* Usage:
|
|
7
7
|
* import { dominus } from 'dominus-sdk-nodejs';
|
|
8
8
|
*
|
|
9
|
-
* // Secrets
|
|
10
|
-
* const value = await dominus.
|
|
11
|
-
* await dominus.
|
|
9
|
+
* // Secrets (root-level shortcuts)
|
|
10
|
+
* const value = await dominus.get("DB_URL");
|
|
11
|
+
* await dominus.upsert("KEY", "value");
|
|
12
12
|
*
|
|
13
|
-
* // Database
|
|
13
|
+
* // Database (root-level shortcuts)
|
|
14
|
+
* const tables = await dominus.listTables();
|
|
15
|
+
* const users = await dominus.queryTable("users", { filters: { status: "active" } });
|
|
16
|
+
* await dominus.insertRow("users", { name: "John" });
|
|
17
|
+
*
|
|
18
|
+
* // Secure table access (with audit logging)
|
|
19
|
+
* const patients = await dominus.secure.query("patients", {
|
|
20
|
+
* reason: "Reviewing chart for appointment #123",
|
|
21
|
+
* actor: userId
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Database (namespace)
|
|
14
25
|
* const tables = await dominus.db.tables();
|
|
15
26
|
* const users = await dominus.db.query("users", { filters: { status: "active" } });
|
|
16
|
-
* await dominus.db.insert("users", { name: "John" });
|
|
17
27
|
*
|
|
18
28
|
* // Redis
|
|
19
29
|
* await dominus.redis.set("key", "value", { ttl: 3600 });
|
|
@@ -25,7 +35,7 @@
|
|
|
25
35
|
*
|
|
26
36
|
* // Auth
|
|
27
37
|
* const users = await dominus.auth.listUsers();
|
|
28
|
-
* await dominus.auth.
|
|
38
|
+
* await dominus.auth.createUser({ username: "john", email: "j@ex.com", password: "secret" });
|
|
29
39
|
*
|
|
30
40
|
* // DDL
|
|
31
41
|
* await dominus.ddl.createTable("orders", [{ name: "id", type: "UUID" }]);
|
|
@@ -45,21 +55,28 @@
|
|
|
45
55
|
* // Health
|
|
46
56
|
* const status = await dominus.health.check();
|
|
47
57
|
*
|
|
58
|
+
* // Crypto helpers
|
|
59
|
+
* import { hashPassword, hashPsk, generateToken } from 'dominus-sdk-nodejs';
|
|
60
|
+
* const hashed = hashPassword("secret");
|
|
61
|
+
*
|
|
48
62
|
* Configuration:
|
|
49
63
|
* Set DOMINUS_TOKEN environment variable with your PSK token.
|
|
50
64
|
*/
|
|
51
65
|
import { SecretsNamespace } from './namespaces/secrets.js';
|
|
52
|
-
import { DbNamespace } from './namespaces/db.js';
|
|
66
|
+
import { DbNamespace, QueryOptions, QueryResult } from './namespaces/db.js';
|
|
53
67
|
import { RedisNamespace } from './namespaces/redis.js';
|
|
54
68
|
import { FilesNamespace } from './namespaces/files.js';
|
|
55
69
|
import { AuthNamespace } from './namespaces/auth.js';
|
|
56
|
-
import { DdlNamespace } from './namespaces/ddl.js';
|
|
70
|
+
import { DdlNamespace, ColumnDefinition } from './namespaces/ddl.js';
|
|
57
71
|
import { LogsNamespace } from './namespaces/logs.js';
|
|
58
72
|
import { PortalNamespace } from './namespaces/portal.js';
|
|
59
73
|
import { CourierNamespace } from './namespaces/courier.js';
|
|
60
74
|
import { OpenNamespace } from './namespaces/open.js';
|
|
61
75
|
import { HealthNamespace } from './namespaces/health.js';
|
|
76
|
+
import { SecureNamespace } from './namespaces/secure.js';
|
|
62
77
|
export { DominusError, AuthenticationError, AuthorizationError, NotFoundError, ValidationError, ConflictError, ServiceError, ConnectionError, TimeoutError, SecureTableError, } from './lib/errors.js';
|
|
78
|
+
export { hashPassword, verifyPasswordLocal, hashPsk, verifyPskLocal, generatePskLocal, hashToken, generateToken, } from './lib/crypto.js';
|
|
79
|
+
export { CircuitBreaker, DominusCache, exponentialBackoffWithJitter, dominusCache, orchestratorCircuitBreaker, } from './lib/cache.js';
|
|
63
80
|
export type { DominusClient } from './lib/client.js';
|
|
64
81
|
export type { Secret, UpsertResult } from './namespaces/secrets.js';
|
|
65
82
|
export type { QueryOptions, QueryResult, TableInfo, ColumnInfo } from './namespaces/db.js';
|
|
@@ -70,10 +87,12 @@ export type { LogContext, LogEntry, BatchResult } from './namespaces/logs.js';
|
|
|
70
87
|
export type { Session } from './namespaces/portal.js';
|
|
71
88
|
export type { SendResult } from './namespaces/courier.js';
|
|
72
89
|
export type { HealthStatus } from './namespaces/health.js';
|
|
90
|
+
export type { SecureQueryOptions, SecureAccessContext } from './namespaces/secure.js';
|
|
73
91
|
/**
|
|
74
92
|
* Main Dominus SDK class.
|
|
75
93
|
*
|
|
76
|
-
* Provides namespace-based access to all Dominus services
|
|
94
|
+
* Provides namespace-based access to all Dominus services,
|
|
95
|
+
* plus root-level shortcuts for common operations.
|
|
77
96
|
*/
|
|
78
97
|
export declare class Dominus {
|
|
79
98
|
private _client;
|
|
@@ -81,6 +100,8 @@ export declare class Dominus {
|
|
|
81
100
|
readonly secrets: SecretsNamespace;
|
|
82
101
|
/** Database CRUD operations (Scribe) */
|
|
83
102
|
readonly db: DbNamespace;
|
|
103
|
+
/** Secure table operations with audit logging */
|
|
104
|
+
readonly secure: SecureNamespace;
|
|
84
105
|
/** Redis caching operations (Whisperer) */
|
|
85
106
|
readonly redis: RedisNamespace;
|
|
86
107
|
/** File storage operations (Archivist) */
|
|
@@ -108,6 +129,62 @@ export declare class Dominus {
|
|
|
108
129
|
* Create or update a secret (shortcut for dominus.secrets.upsert).
|
|
109
130
|
*/
|
|
110
131
|
upsert(key: string, value: string, comment?: string): Promise<import("./namespaces/secrets.js").UpsertResult>;
|
|
132
|
+
/**
|
|
133
|
+
* List tables in a schema (shortcut for dominus.db.tables).
|
|
134
|
+
*/
|
|
135
|
+
listTables(schema?: string): Promise<import("./namespaces/db.js").TableInfo[]>;
|
|
136
|
+
/**
|
|
137
|
+
* Query table data (shortcut for dominus.db.query).
|
|
138
|
+
*/
|
|
139
|
+
queryTable(table: string, options?: QueryOptions): Promise<QueryResult>;
|
|
140
|
+
/**
|
|
141
|
+
* Insert a row (shortcut for dominus.db.insert).
|
|
142
|
+
*/
|
|
143
|
+
insertRow(table: string, data: Record<string, unknown>, options?: {
|
|
144
|
+
schema?: string;
|
|
145
|
+
reason?: string;
|
|
146
|
+
actor?: string;
|
|
147
|
+
}): Promise<Record<string, unknown>>;
|
|
148
|
+
/**
|
|
149
|
+
* Update rows (shortcut for dominus.db.update).
|
|
150
|
+
*/
|
|
151
|
+
updateRows(table: string, data: Record<string, unknown>, filters: Record<string, unknown>, options?: {
|
|
152
|
+
schema?: string;
|
|
153
|
+
reason?: string;
|
|
154
|
+
actor?: string;
|
|
155
|
+
}): Promise<{
|
|
156
|
+
affected_rows: number;
|
|
157
|
+
}>;
|
|
158
|
+
/**
|
|
159
|
+
* Delete rows (shortcut for dominus.db.delete).
|
|
160
|
+
*/
|
|
161
|
+
deleteRows(table: string, filters: Record<string, unknown>, options?: {
|
|
162
|
+
schema?: string;
|
|
163
|
+
reason?: string;
|
|
164
|
+
actor?: string;
|
|
165
|
+
}): Promise<{
|
|
166
|
+
affected_rows: number;
|
|
167
|
+
}>;
|
|
168
|
+
/**
|
|
169
|
+
* List columns in a table (shortcut for dominus.db.columns).
|
|
170
|
+
*/
|
|
171
|
+
listColumns(table: string, schema?: string): Promise<import("./namespaces/db.js").ColumnInfo[]>;
|
|
172
|
+
/**
|
|
173
|
+
* Create a table (shortcut for dominus.ddl.createTable).
|
|
174
|
+
*/
|
|
175
|
+
addTable(tableName: string, columns: ColumnDefinition[], schema?: string): Promise<Record<string, unknown>>;
|
|
176
|
+
/**
|
|
177
|
+
* Drop a table (shortcut for dominus.ddl.dropTable).
|
|
178
|
+
*/
|
|
179
|
+
deleteTable(tableName: string, schema?: string): Promise<Record<string, unknown>>;
|
|
180
|
+
/**
|
|
181
|
+
* Add a column to a table (shortcut for dominus.ddl.addColumn).
|
|
182
|
+
*/
|
|
183
|
+
addColumn(tableName: string, column: ColumnDefinition, schema?: string): Promise<Record<string, unknown>>;
|
|
184
|
+
/**
|
|
185
|
+
* Drop a column from a table (shortcut for dominus.ddl.dropColumn).
|
|
186
|
+
*/
|
|
187
|
+
deleteColumn(tableName: string, columnName: string, schema?: string): Promise<Record<string, unknown>>;
|
|
111
188
|
}
|
|
112
189
|
export declare const dominus: Dominus;
|
|
113
190
|
export default dominus;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,14 +6,24 @@
|
|
|
6
6
|
* Usage:
|
|
7
7
|
* import { dominus } from 'dominus-sdk-nodejs';
|
|
8
8
|
*
|
|
9
|
-
* // Secrets
|
|
10
|
-
* const value = await dominus.
|
|
11
|
-
* await dominus.
|
|
9
|
+
* // Secrets (root-level shortcuts)
|
|
10
|
+
* const value = await dominus.get("DB_URL");
|
|
11
|
+
* await dominus.upsert("KEY", "value");
|
|
12
12
|
*
|
|
13
|
-
* // Database
|
|
13
|
+
* // Database (root-level shortcuts)
|
|
14
|
+
* const tables = await dominus.listTables();
|
|
15
|
+
* const users = await dominus.queryTable("users", { filters: { status: "active" } });
|
|
16
|
+
* await dominus.insertRow("users", { name: "John" });
|
|
17
|
+
*
|
|
18
|
+
* // Secure table access (with audit logging)
|
|
19
|
+
* const patients = await dominus.secure.query("patients", {
|
|
20
|
+
* reason: "Reviewing chart for appointment #123",
|
|
21
|
+
* actor: userId
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Database (namespace)
|
|
14
25
|
* const tables = await dominus.db.tables();
|
|
15
26
|
* const users = await dominus.db.query("users", { filters: { status: "active" } });
|
|
16
|
-
* await dominus.db.insert("users", { name: "John" });
|
|
17
27
|
*
|
|
18
28
|
* // Redis
|
|
19
29
|
* await dominus.redis.set("key", "value", { ttl: 3600 });
|
|
@@ -25,7 +35,7 @@
|
|
|
25
35
|
*
|
|
26
36
|
* // Auth
|
|
27
37
|
* const users = await dominus.auth.listUsers();
|
|
28
|
-
* await dominus.auth.
|
|
38
|
+
* await dominus.auth.createUser({ username: "john", email: "j@ex.com", password: "secret" });
|
|
29
39
|
*
|
|
30
40
|
* // DDL
|
|
31
41
|
* await dominus.ddl.createTable("orders", [{ name: "id", type: "UUID" }]);
|
|
@@ -45,6 +55,10 @@
|
|
|
45
55
|
* // Health
|
|
46
56
|
* const status = await dominus.health.check();
|
|
47
57
|
*
|
|
58
|
+
* // Crypto helpers
|
|
59
|
+
* import { hashPassword, hashPsk, generateToken } from 'dominus-sdk-nodejs';
|
|
60
|
+
* const hashed = hashPassword("secret");
|
|
61
|
+
*
|
|
48
62
|
* Configuration:
|
|
49
63
|
* Set DOMINUS_TOKEN environment variable with your PSK token.
|
|
50
64
|
*/
|
|
@@ -60,12 +74,24 @@ import { PortalNamespace } from './namespaces/portal.js';
|
|
|
60
74
|
import { CourierNamespace } from './namespaces/courier.js';
|
|
61
75
|
import { OpenNamespace } from './namespaces/open.js';
|
|
62
76
|
import { HealthNamespace } from './namespaces/health.js';
|
|
77
|
+
import { SecureNamespace } from './namespaces/secure.js';
|
|
78
|
+
// Initialize cache with token for encryption
|
|
79
|
+
import { dominusCache } from './lib/cache.js';
|
|
80
|
+
const token = process.env.DOMINUS_TOKEN;
|
|
81
|
+
if (token) {
|
|
82
|
+
dominusCache.setEncryptionKey(token);
|
|
83
|
+
}
|
|
63
84
|
// Re-export errors for consumers
|
|
64
85
|
export { DominusError, AuthenticationError, AuthorizationError, NotFoundError, ValidationError, ConflictError, ServiceError, ConnectionError, TimeoutError, SecureTableError, } from './lib/errors.js';
|
|
86
|
+
// Re-export crypto helpers for consumers
|
|
87
|
+
export { hashPassword, verifyPasswordLocal, hashPsk, verifyPskLocal, generatePskLocal, hashToken, generateToken, } from './lib/crypto.js';
|
|
88
|
+
// Re-export cache utilities (internal but useful)
|
|
89
|
+
export { CircuitBreaker, DominusCache, exponentialBackoffWithJitter, dominusCache, orchestratorCircuitBreaker, } from './lib/cache.js';
|
|
65
90
|
/**
|
|
66
91
|
* Main Dominus SDK class.
|
|
67
92
|
*
|
|
68
|
-
* Provides namespace-based access to all Dominus services
|
|
93
|
+
* Provides namespace-based access to all Dominus services,
|
|
94
|
+
* plus root-level shortcuts for common operations.
|
|
69
95
|
*/
|
|
70
96
|
export class Dominus {
|
|
71
97
|
_client;
|
|
@@ -73,6 +99,8 @@ export class Dominus {
|
|
|
73
99
|
secrets;
|
|
74
100
|
/** Database CRUD operations (Scribe) */
|
|
75
101
|
db;
|
|
102
|
+
/** Secure table operations with audit logging */
|
|
103
|
+
secure;
|
|
76
104
|
/** Redis caching operations (Whisperer) */
|
|
77
105
|
redis;
|
|
78
106
|
/** File storage operations (Archivist) */
|
|
@@ -96,6 +124,7 @@ export class Dominus {
|
|
|
96
124
|
// Initialize all namespaces
|
|
97
125
|
this.secrets = new SecretsNamespace(this._client);
|
|
98
126
|
this.db = new DbNamespace(this._client);
|
|
127
|
+
this.secure = new SecureNamespace(this._client);
|
|
99
128
|
this.redis = new RedisNamespace(this._client);
|
|
100
129
|
this.files = new FilesNamespace(this._client);
|
|
101
130
|
this.auth = new AuthNamespace(this._client);
|
|
@@ -107,7 +136,7 @@ export class Dominus {
|
|
|
107
136
|
this.health = new HealthNamespace(this._client);
|
|
108
137
|
}
|
|
109
138
|
// ========================================
|
|
110
|
-
// ROOT-LEVEL SHORTCUTS
|
|
139
|
+
// ROOT-LEVEL SHORTCUTS - SECRETS
|
|
111
140
|
// ========================================
|
|
112
141
|
/**
|
|
113
142
|
* Get a secret value (shortcut for dominus.secrets.get).
|
|
@@ -121,6 +150,72 @@ export class Dominus {
|
|
|
121
150
|
async upsert(key, value, comment) {
|
|
122
151
|
return this.secrets.upsert(key, value, comment);
|
|
123
152
|
}
|
|
153
|
+
// ========================================
|
|
154
|
+
// ROOT-LEVEL SHORTCUTS - DATABASE
|
|
155
|
+
// ========================================
|
|
156
|
+
/**
|
|
157
|
+
* List tables in a schema (shortcut for dominus.db.tables).
|
|
158
|
+
*/
|
|
159
|
+
async listTables(schema = 'public') {
|
|
160
|
+
return this.db.tables(schema);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Query table data (shortcut for dominus.db.query).
|
|
164
|
+
*/
|
|
165
|
+
async queryTable(table, options) {
|
|
166
|
+
return this.db.query(table, options);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Insert a row (shortcut for dominus.db.insert).
|
|
170
|
+
*/
|
|
171
|
+
async insertRow(table, data, options) {
|
|
172
|
+
return this.db.insert(table, data, options);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Update rows (shortcut for dominus.db.update).
|
|
176
|
+
*/
|
|
177
|
+
async updateRows(table, data, filters, options) {
|
|
178
|
+
return this.db.update(table, data, filters, options);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Delete rows (shortcut for dominus.db.delete).
|
|
182
|
+
*/
|
|
183
|
+
async deleteRows(table, filters, options) {
|
|
184
|
+
return this.db.delete(table, filters, options);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* List columns in a table (shortcut for dominus.db.columns).
|
|
188
|
+
*/
|
|
189
|
+
async listColumns(table, schema = 'public') {
|
|
190
|
+
return this.db.columns(table, schema);
|
|
191
|
+
}
|
|
192
|
+
// ========================================
|
|
193
|
+
// ROOT-LEVEL SHORTCUTS - DDL
|
|
194
|
+
// ========================================
|
|
195
|
+
/**
|
|
196
|
+
* Create a table (shortcut for dominus.ddl.createTable).
|
|
197
|
+
*/
|
|
198
|
+
async addTable(tableName, columns, schema = 'public') {
|
|
199
|
+
return this.ddl.createTable(tableName, columns, schema);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Drop a table (shortcut for dominus.ddl.dropTable).
|
|
203
|
+
*/
|
|
204
|
+
async deleteTable(tableName, schema = 'public') {
|
|
205
|
+
return this.ddl.dropTable(tableName, schema);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Add a column to a table (shortcut for dominus.ddl.addColumn).
|
|
209
|
+
*/
|
|
210
|
+
async addColumn(tableName, column, schema = 'public') {
|
|
211
|
+
return this.ddl.addColumn(tableName, column, schema);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Drop a column from a table (shortcut for dominus.ddl.dropColumn).
|
|
215
|
+
*/
|
|
216
|
+
async deleteColumn(tableName, columnName, schema = 'public') {
|
|
217
|
+
return this.ddl.dropColumn(tableName, columnName, schema);
|
|
218
|
+
}
|
|
124
219
|
}
|
|
125
220
|
// Create and export singleton instance
|
|
126
221
|
export const dominus = new Dominus();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal cache with automatic encryption and circuit breaker.
|
|
3
|
+
*
|
|
4
|
+
* NOT exposed to SDK users - internal use only.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Circuit breaker states.
|
|
8
|
+
*/
|
|
9
|
+
declare enum CircuitState {
|
|
10
|
+
CLOSED = "closed",
|
|
11
|
+
OPEN = "open",
|
|
12
|
+
HALF_OPEN = "half_open"
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Simple circuit breaker to prevent runaway retries.
|
|
16
|
+
*
|
|
17
|
+
* States:
|
|
18
|
+
* - CLOSED: Normal operation, requests pass through
|
|
19
|
+
* - OPEN: Too many failures, requests blocked
|
|
20
|
+
* - HALF_OPEN: Testing if service recovered
|
|
21
|
+
*
|
|
22
|
+
* Prevents CPU/quota exhaustion from retry storms.
|
|
23
|
+
*/
|
|
24
|
+
export declare class CircuitBreaker {
|
|
25
|
+
private failureThreshold;
|
|
26
|
+
private recoveryTimeout;
|
|
27
|
+
private halfOpenMaxCalls;
|
|
28
|
+
private failureCount;
|
|
29
|
+
private state;
|
|
30
|
+
private lastFailureTime;
|
|
31
|
+
private halfOpenCalls;
|
|
32
|
+
constructor(failureThreshold?: number, recoveryTimeout?: number, // 30 seconds in ms
|
|
33
|
+
halfOpenMaxCalls?: number);
|
|
34
|
+
/**
|
|
35
|
+
* Get current state, transitioning OPEN→HALF_OPEN if timeout elapsed.
|
|
36
|
+
*/
|
|
37
|
+
getState(): CircuitState;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a request can be executed.
|
|
40
|
+
*/
|
|
41
|
+
canExecute(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Record a successful call.
|
|
44
|
+
*/
|
|
45
|
+
recordSuccess(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Record a failed call.
|
|
48
|
+
*/
|
|
49
|
+
recordFailure(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Record a call attempt in HALF_OPEN state.
|
|
52
|
+
*/
|
|
53
|
+
recordHalfOpenCall(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Reset the circuit breaker.
|
|
56
|
+
*/
|
|
57
|
+
reset(): void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate backoff delay with jitter to prevent thundering herd.
|
|
61
|
+
*
|
|
62
|
+
* @param attempt - Zero-based attempt number
|
|
63
|
+
* @param baseDelay - Base delay in milliseconds
|
|
64
|
+
* @param maxDelay - Maximum delay cap
|
|
65
|
+
* @param jitter - Jitter factor (0-1), adds randomness
|
|
66
|
+
* @returns Delay in milliseconds
|
|
67
|
+
*/
|
|
68
|
+
export declare function exponentialBackoffWithJitter(attempt: number, baseDelay?: number, maxDelay?: number, jitter?: number): number;
|
|
69
|
+
/**
|
|
70
|
+
* Internal process-local cache with auto-encryption.
|
|
71
|
+
*
|
|
72
|
+
* Used by dominus services only:
|
|
73
|
+
* - Validation state
|
|
74
|
+
* - Service URLs
|
|
75
|
+
* - API responses
|
|
76
|
+
*
|
|
77
|
+
* NOT accessible by SDK users.
|
|
78
|
+
*/
|
|
79
|
+
export declare class DominusCache {
|
|
80
|
+
private defaultTtl;
|
|
81
|
+
private store;
|
|
82
|
+
private cipher;
|
|
83
|
+
constructor(defaultTtl?: number);
|
|
84
|
+
/**
|
|
85
|
+
* Initialize encryption using auth token.
|
|
86
|
+
*/
|
|
87
|
+
setEncryptionKey(token: string): void;
|
|
88
|
+
/**
|
|
89
|
+
* Get and decrypt, refresh TTL.
|
|
90
|
+
*/
|
|
91
|
+
get<T = unknown>(key: string): T | null;
|
|
92
|
+
/**
|
|
93
|
+
* Encrypt and store.
|
|
94
|
+
*/
|
|
95
|
+
set<T = unknown>(key: string, value: T, ttl?: number): void;
|
|
96
|
+
/**
|
|
97
|
+
* Delete key.
|
|
98
|
+
*/
|
|
99
|
+
delete(key: string): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Clear all.
|
|
102
|
+
*/
|
|
103
|
+
clear(): number;
|
|
104
|
+
/**
|
|
105
|
+
* Get cache size.
|
|
106
|
+
*/
|
|
107
|
+
size(): number;
|
|
108
|
+
}
|
|
109
|
+
export declare const dominusCache: DominusCache;
|
|
110
|
+
export declare const orchestratorCircuitBreaker: CircuitBreaker;
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,aAAK,YAAY;IACf,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,SAAS,cAAc;CACxB;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAc;IAOvB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,gBAAgB;IAR1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,aAAa,CAAK;gBAGhB,gBAAgB,SAAI,EACpB,eAAe,SAAQ,EAAE,mBAAmB;IAC5C,gBAAgB,SAAI;IAG9B;;OAEG;IACH,QAAQ,IAAI,YAAY;IAUxB;;OAEG;IACH,UAAU,IAAI,OAAO;IAWrB;;OAEG;IACH,aAAa,IAAI,IAAI;IAQrB;;OAEG;IACH,aAAa,IAAI,IAAI;IAYrB;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,SAAS,SAAO,EAChB,QAAQ,SAAQ,EAChB,MAAM,SAAM,GACX,MAAM,CAIR;AAOD;;;;;;;;;GASG;AACH,qBAAa,YAAY;IAIX,OAAO,CAAC,UAAU;IAH9B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,MAAM,CAAmD;gBAE7C,UAAU,SAAS;IAEvC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMrC;;OAEG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IA4CvC;;OAEG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IA+B3D;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,MAAM;IAMf;;OAEG;IACH,IAAI,IAAI,MAAM;CAGf;AAGD,eAAO,MAAM,YAAY,cAA2B,CAAC;AAGrD,eAAO,MAAM,0BAA0B,gBAItC,CAAC"}
|