llng-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +77 -0
- package/.prettierrc +7 -0
- package/LICENSE +661 -0
- package/README.md +502 -0
- package/dist/__tests__/api-transport.test.d.ts +1 -0
- package/dist/__tests__/api-transport.test.js +577 -0
- package/dist/__tests__/api-transport.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +472 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/integration/api-mode.test.d.ts +1 -0
- package/dist/__tests__/integration/api-mode.test.js +199 -0
- package/dist/__tests__/integration/api-mode.test.js.map +1 -0
- package/dist/__tests__/integration/oidc-rp.test.d.ts +1 -0
- package/dist/__tests__/integration/oidc-rp.test.js +120 -0
- package/dist/__tests__/integration/oidc-rp.test.js.map +1 -0
- package/dist/__tests__/integration/ssh-mode.test.d.ts +1 -0
- package/dist/__tests__/integration/ssh-mode.test.js +101 -0
- package/dist/__tests__/integration/ssh-mode.test.js.map +1 -0
- package/dist/__tests__/k8s-transport.test.d.ts +1 -0
- package/dist/__tests__/k8s-transport.test.js +254 -0
- package/dist/__tests__/k8s-transport.test.js.map +1 -0
- package/dist/__tests__/oidc-tools.test.d.ts +1 -0
- package/dist/__tests__/oidc-tools.test.js +457 -0
- package/dist/__tests__/oidc-tools.test.js.map +1 -0
- package/dist/__tests__/registry.test.d.ts +1 -0
- package/dist/__tests__/registry.test.js +96 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/ssh-transport.test.d.ts +1 -0
- package/dist/__tests__/ssh-transport.test.js +618 -0
- package/dist/__tests__/ssh-transport.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +1 -0
- package/dist/__tests__/tools.test.js +525 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/config.d.ts +65 -0
- package/dist/config.js +506 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/documentation.d.ts +5 -0
- package/dist/resources/documentation.js +56 -0
- package/dist/resources/documentation.js.map +1 -0
- package/dist/tools/cli-utilities.d.ts +3 -0
- package/dist/tools/cli-utilities.js +187 -0
- package/dist/tools/cli-utilities.js.map +1 -0
- package/dist/tools/config.d.ts +6 -0
- package/dist/tools/config.js +326 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/consents.d.ts +3 -0
- package/dist/tools/consents.js +39 -0
- package/dist/tools/consents.js.map +1 -0
- package/dist/tools/instances.d.ts +3 -0
- package/dist/tools/instances.js +14 -0
- package/dist/tools/instances.js.map +1 -0
- package/dist/tools/oidc-rp.d.ts +6 -0
- package/dist/tools/oidc-rp.js +246 -0
- package/dist/tools/oidc-rp.js.map +1 -0
- package/dist/tools/oidc.d.ts +3 -0
- package/dist/tools/oidc.js +343 -0
- package/dist/tools/oidc.js.map +1 -0
- package/dist/tools/secondfactors.d.ts +3 -0
- package/dist/tools/secondfactors.js +62 -0
- package/dist/tools/secondfactors.js.map +1 -0
- package/dist/tools/sessions.d.ts +6 -0
- package/dist/tools/sessions.js +300 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/transport/api.d.ts +35 -0
- package/dist/transport/api.js +327 -0
- package/dist/transport/api.js.map +1 -0
- package/dist/transport/interface.d.ts +50 -0
- package/dist/transport/interface.js +2 -0
- package/dist/transport/interface.js.map +1 -0
- package/dist/transport/k8s.d.ts +41 -0
- package/dist/transport/k8s.js +303 -0
- package/dist/transport/k8s.js.map +1 -0
- package/dist/transport/registry.d.ts +20 -0
- package/dist/transport/registry.js +91 -0
- package/dist/transport/registry.js.map +1 -0
- package/dist/transport/ssh.d.ts +37 -0
- package/dist/transport/ssh.js +353 -0
- package/dist/transport/ssh.js.map +1 -0
- package/docker-compose.test.yml +16 -0
- package/eslint.config.js +21 -0
- package/package.json +38 -0
- package/src/__tests__/api-transport.test.ts +746 -0
- package/src/__tests__/config.test.ts +587 -0
- package/src/__tests__/integration/api-mode.test.ts +229 -0
- package/src/__tests__/integration/oidc-rp.test.ts +138 -0
- package/src/__tests__/integration/ssh-mode.test.ts +113 -0
- package/src/__tests__/k8s-transport.test.ts +342 -0
- package/src/__tests__/oidc-tools.test.ts +554 -0
- package/src/__tests__/registry.test.ts +110 -0
- package/src/__tests__/ssh-transport.test.ts +805 -0
- package/src/__tests__/tools.test.ts +735 -0
- package/src/config.ts +605 -0
- package/src/index.ts +48 -0
- package/src/resources/documentation.ts +65 -0
- package/src/tools/cli-utilities.ts +207 -0
- package/src/tools/config.ts +382 -0
- package/src/tools/consents.ts +50 -0
- package/src/tools/instances.ts +21 -0
- package/src/tools/oidc-rp.ts +299 -0
- package/src/tools/oidc.ts +434 -0
- package/src/tools/secondfactors.ts +78 -0
- package/src/tools/sessions.ts +342 -0
- package/src/transport/api.ts +429 -0
- package/src/transport/interface.ts +58 -0
- package/src/transport/k8s.ts +367 -0
- package/src/transport/registry.ts +105 -0
- package/src/transport/ssh.ts +430 -0
- package/tsconfig.json +16 -0
- package/vitest.config.ts +8 -0
- package/vitest.integration.config.ts +9 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import https from "https";
|
|
2
|
+
export class ApiTransport {
|
|
3
|
+
baseUrl;
|
|
4
|
+
basicAuth;
|
|
5
|
+
verifySsl;
|
|
6
|
+
agent;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
// Strip trailing slash
|
|
9
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
10
|
+
this.basicAuth = config.basicAuth;
|
|
11
|
+
this.verifySsl = config.verifySsl !== false;
|
|
12
|
+
// Create agent for SSL verification control
|
|
13
|
+
if (!this.verifySsl) {
|
|
14
|
+
console.error("WARNING: SSL certificate verification is disabled. This makes the connection vulnerable to man-in-the-middle attacks. Do not use in production.");
|
|
15
|
+
this.agent = new https.Agent({
|
|
16
|
+
rejectUnauthorized: false,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async request(method, path, body) {
|
|
21
|
+
const url = `${this.baseUrl}${path}`;
|
|
22
|
+
const headers = {
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
};
|
|
25
|
+
// Add Basic Auth if configured
|
|
26
|
+
if (this.basicAuth) {
|
|
27
|
+
const credentials = Buffer.from(`${this.basicAuth.username}:${this.basicAuth.password}`).toString("base64");
|
|
28
|
+
headers["Authorization"] = `Basic ${credentials}`;
|
|
29
|
+
}
|
|
30
|
+
const options = {
|
|
31
|
+
method,
|
|
32
|
+
headers,
|
|
33
|
+
// @ts-expect-error - agent is valid for https URLs
|
|
34
|
+
agent: this.agent,
|
|
35
|
+
};
|
|
36
|
+
if (body && method !== "GET") {
|
|
37
|
+
options.body = JSON.stringify(body);
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(url, options);
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
throw new Error(`HTTP ${response.status} ${response.statusText}`);
|
|
43
|
+
}
|
|
44
|
+
// Handle empty responses
|
|
45
|
+
const contentType = response.headers.get("content-type");
|
|
46
|
+
if (contentType && contentType.includes("application/json")) {
|
|
47
|
+
return await response.json();
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const text = await response.text();
|
|
51
|
+
if (!text) {
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
return JSON.parse(text);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return text;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error instanceof Error) {
|
|
64
|
+
throw new Error(`API request failed: ${error.message}`);
|
|
65
|
+
}
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async configInfo() {
|
|
70
|
+
const data = await this.request("GET", "/api/v1/config/latest");
|
|
71
|
+
return {
|
|
72
|
+
cfgNum: data.cfgNum,
|
|
73
|
+
cfgAuthor: data.cfgAuthor,
|
|
74
|
+
cfgDate: data.cfgDate,
|
|
75
|
+
cfgLog: data.cfgLog,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async configGet(keys) {
|
|
79
|
+
const config = await this.request("GET", "/api/v1/config/latest");
|
|
80
|
+
const result = {};
|
|
81
|
+
for (const key of keys) {
|
|
82
|
+
if (key in config) {
|
|
83
|
+
result[key] = config[key];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
async configSet(pairs, log) {
|
|
89
|
+
// Get current config
|
|
90
|
+
const currentConfig = await this.request("GET", "/api/v1/config/latest");
|
|
91
|
+
// Merge changes
|
|
92
|
+
const updatedConfig = { ...currentConfig, ...pairs };
|
|
93
|
+
// Add log if provided
|
|
94
|
+
if (log) {
|
|
95
|
+
updatedConfig.cfgLog = log;
|
|
96
|
+
}
|
|
97
|
+
// Save config
|
|
98
|
+
await this.request("PUT", "/api/v1/config", updatedConfig);
|
|
99
|
+
}
|
|
100
|
+
async configAddKey(key, subkey, value) {
|
|
101
|
+
// Get current config
|
|
102
|
+
const config = await this.request("GET", "/api/v1/config/latest");
|
|
103
|
+
// Initialize the key if it doesn't exist
|
|
104
|
+
if (!config[key]) {
|
|
105
|
+
config[key] = {};
|
|
106
|
+
}
|
|
107
|
+
// Add the subkey
|
|
108
|
+
config[key][subkey] = value;
|
|
109
|
+
// Save config
|
|
110
|
+
await this.request("PUT", "/api/v1/config", config);
|
|
111
|
+
}
|
|
112
|
+
async configDelKey(key, subkey) {
|
|
113
|
+
// Get current config
|
|
114
|
+
const config = await this.request("GET", "/api/v1/config/latest");
|
|
115
|
+
// Remove the subkey if it exists
|
|
116
|
+
if (config[key] && subkey in config[key]) {
|
|
117
|
+
delete config[key][subkey];
|
|
118
|
+
// Save config
|
|
119
|
+
await this.request("PUT", "/api/v1/config", config);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async configSave() {
|
|
123
|
+
const config = await this.request("GET", "/api/v1/config/latest");
|
|
124
|
+
return JSON.stringify(config, null, 2);
|
|
125
|
+
}
|
|
126
|
+
async configRestore(json) {
|
|
127
|
+
const config = JSON.parse(json);
|
|
128
|
+
await this.request("PUT", "/api/v1/config", config);
|
|
129
|
+
}
|
|
130
|
+
async configMerge(json) {
|
|
131
|
+
const snippet = JSON.parse(json);
|
|
132
|
+
const currentConfig = await this.request("GET", "/api/v1/config/latest");
|
|
133
|
+
// Deep merge
|
|
134
|
+
const merged = this.deepMerge(currentConfig, snippet);
|
|
135
|
+
await this.request("PUT", "/api/v1/config", merged);
|
|
136
|
+
}
|
|
137
|
+
deepMerge(target, source) {
|
|
138
|
+
const result = { ...target };
|
|
139
|
+
for (const key in source) {
|
|
140
|
+
if (key === "__proto__" || key === "constructor" || key === "prototype")
|
|
141
|
+
continue;
|
|
142
|
+
const value = source[key];
|
|
143
|
+
if (value !== null && value instanceof Object && !Array.isArray(value)) {
|
|
144
|
+
result[key] = this.deepMerge(result[key] || {}, value);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
result[key] = value;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
async configRollback() {
|
|
153
|
+
// Get current config to find cfgNum
|
|
154
|
+
const current = await this.request("GET", "/api/v1/config/latest");
|
|
155
|
+
const currentNum = current.cfgNum;
|
|
156
|
+
if (currentNum <= 1) {
|
|
157
|
+
throw new Error("Cannot rollback: already at first config");
|
|
158
|
+
}
|
|
159
|
+
// Get previous config
|
|
160
|
+
const previous = await this.request("GET", `/api/v1/config/${currentNum - 1}`);
|
|
161
|
+
// Save it as the new current config
|
|
162
|
+
await this.request("PUT", "/api/v1/config", previous);
|
|
163
|
+
}
|
|
164
|
+
async configUpdateCache() {
|
|
165
|
+
// No-op for API mode - cache is managed server-side
|
|
166
|
+
}
|
|
167
|
+
async configTestEmail(_destination) {
|
|
168
|
+
throw new Error("configTestEmail is not supported via API. Use SSH or K8s mode.");
|
|
169
|
+
}
|
|
170
|
+
resolveBackend(options) {
|
|
171
|
+
if (options?.persistent)
|
|
172
|
+
return "persistent";
|
|
173
|
+
if (options?.refreshTokens)
|
|
174
|
+
return "oidc";
|
|
175
|
+
return options?.backend || "global";
|
|
176
|
+
}
|
|
177
|
+
async sessionGet(id, options) {
|
|
178
|
+
const backendName = this.resolveBackend(options);
|
|
179
|
+
// hash option is not supported via API
|
|
180
|
+
return await this.request("GET", `/api/v1/sessions/${encodeURIComponent(backendName)}/${encodeURIComponent(id)}`);
|
|
181
|
+
}
|
|
182
|
+
async sessionSearch(filters) {
|
|
183
|
+
let backend = filters.backend || "global";
|
|
184
|
+
if (filters.persistent) {
|
|
185
|
+
backend = "persistent";
|
|
186
|
+
}
|
|
187
|
+
const queryParams = [];
|
|
188
|
+
// Handle refreshTokens: use backend="oidc" and add _type filter
|
|
189
|
+
if (filters.refreshTokens) {
|
|
190
|
+
backend = "oidc";
|
|
191
|
+
const whereClause = filters.where
|
|
192
|
+
? { ...filters.where, _type: "refresh_token" }
|
|
193
|
+
: { _type: "refresh_token" };
|
|
194
|
+
const whereClauses = Object.entries(whereClause).map(([field, value]) => `${field}=${value}`);
|
|
195
|
+
queryParams.push(`where=${encodeURIComponent(whereClauses.join(" AND "))}`);
|
|
196
|
+
}
|
|
197
|
+
else if (filters.where) {
|
|
198
|
+
// Build where clause
|
|
199
|
+
const whereClauses = Object.entries(filters.where).map(([field, value]) => `${field}=${value}`);
|
|
200
|
+
queryParams.push(`where=${encodeURIComponent(whereClauses.join(" AND "))}`);
|
|
201
|
+
}
|
|
202
|
+
// Handle idOnly: select only _session_id
|
|
203
|
+
if (filters.idOnly) {
|
|
204
|
+
queryParams.push("select=_session_id");
|
|
205
|
+
}
|
|
206
|
+
else if (filters.select && filters.select.length > 0) {
|
|
207
|
+
queryParams.push(`select=${filters.select.join(",")}`);
|
|
208
|
+
}
|
|
209
|
+
// Build count flag
|
|
210
|
+
if (filters.count) {
|
|
211
|
+
queryParams.push("count=1");
|
|
212
|
+
}
|
|
213
|
+
const queryString = queryParams.length > 0 ? `?${queryParams.join("&")}` : "";
|
|
214
|
+
const result = await this.request("GET", `/api/v1/sessions/${encodeURIComponent(backend)}${queryString}`);
|
|
215
|
+
// API returns an object with session IDs as keys, convert to array
|
|
216
|
+
if (typeof result === "object" && !Array.isArray(result)) {
|
|
217
|
+
if (filters.idOnly) {
|
|
218
|
+
return Object.keys(result);
|
|
219
|
+
}
|
|
220
|
+
return Object.entries(result).map(([id, data]) => ({
|
|
221
|
+
id,
|
|
222
|
+
...data,
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
async sessionDelete(ids, options) {
|
|
228
|
+
const backendName = this.resolveBackend(options);
|
|
229
|
+
if (options?.where) {
|
|
230
|
+
// Where-based deletion: search first, then delete matching
|
|
231
|
+
const searchFilters = {
|
|
232
|
+
where: options.where,
|
|
233
|
+
backend: backendName,
|
|
234
|
+
idOnly: true,
|
|
235
|
+
refreshTokens: options.refreshTokens,
|
|
236
|
+
persistent: options.persistent,
|
|
237
|
+
};
|
|
238
|
+
const matchingIds = await this.sessionSearch(searchFilters);
|
|
239
|
+
for (const id of matchingIds) {
|
|
240
|
+
const sessionId = typeof id === "string" ? id : id.id || id._session_id;
|
|
241
|
+
if (sessionId) {
|
|
242
|
+
await this.request("DELETE", `/api/v1/sessions/${encodeURIComponent(backendName)}/${encodeURIComponent(sessionId)}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
for (const id of ids) {
|
|
248
|
+
await this.request("DELETE", `/api/v1/sessions/${encodeURIComponent(backendName)}/${encodeURIComponent(id)}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
async sessionSetKey(id, pairs, options) {
|
|
253
|
+
const backendName = this.resolveBackend(options);
|
|
254
|
+
await this.request("PUT", `/api/v1/sessions/${encodeURIComponent(backendName)}/${encodeURIComponent(id)}`, pairs);
|
|
255
|
+
}
|
|
256
|
+
async sessionDelKey(id, keys, options) {
|
|
257
|
+
const backendName = this.resolveBackend(options);
|
|
258
|
+
const pairs = {};
|
|
259
|
+
for (const key of keys) {
|
|
260
|
+
pairs[key] = null;
|
|
261
|
+
}
|
|
262
|
+
await this.request("PUT", `/api/v1/sessions/${encodeURIComponent(backendName)}/${encodeURIComponent(id)}`, pairs);
|
|
263
|
+
}
|
|
264
|
+
async sessionBackup(backend, refreshTokens, persistent) {
|
|
265
|
+
let backendName = backend || "global";
|
|
266
|
+
if (persistent) {
|
|
267
|
+
backendName = "persistent";
|
|
268
|
+
}
|
|
269
|
+
let path = `/api/v1/sessions/${encodeURIComponent(backendName)}`;
|
|
270
|
+
if (refreshTokens) {
|
|
271
|
+
backendName = "oidc";
|
|
272
|
+
path = `/api/v1/sessions/${encodeURIComponent(backendName)}?where=${encodeURIComponent("_type=refresh_token")}`;
|
|
273
|
+
}
|
|
274
|
+
const sessions = await this.request("GET", path);
|
|
275
|
+
return JSON.stringify(sessions, null, 2);
|
|
276
|
+
}
|
|
277
|
+
async secondFactorsGet(user) {
|
|
278
|
+
const result = await this.request("GET", `/api/v1/secondfactors/${encodeURIComponent(user)}`);
|
|
279
|
+
// API may return object or array, normalize to array
|
|
280
|
+
if (Array.isArray(result)) {
|
|
281
|
+
return result;
|
|
282
|
+
}
|
|
283
|
+
else if (typeof result === "object") {
|
|
284
|
+
return Object.entries(result).map(([id, data]) => ({
|
|
285
|
+
id,
|
|
286
|
+
...data,
|
|
287
|
+
}));
|
|
288
|
+
}
|
|
289
|
+
return [];
|
|
290
|
+
}
|
|
291
|
+
async secondFactorsDelete(user, ids) {
|
|
292
|
+
for (const id of ids) {
|
|
293
|
+
await this.request("DELETE", `/api/v1/secondfactors/${encodeURIComponent(user)}/${encodeURIComponent(id)}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async secondFactorsDelType(user, type) {
|
|
297
|
+
// Get all 2FA devices
|
|
298
|
+
const devices = await this.secondFactorsGet(user);
|
|
299
|
+
// Filter by type and delete
|
|
300
|
+
const toDelete = devices.filter((device) => device.type === type);
|
|
301
|
+
const ids = toDelete.map((device) => device.id);
|
|
302
|
+
await this.secondFactorsDelete(user, ids);
|
|
303
|
+
}
|
|
304
|
+
async consentsGet(user) {
|
|
305
|
+
const result = await this.request("GET", `/api/v1/consents/${encodeURIComponent(user)}`);
|
|
306
|
+
// API may return object or array, normalize to array
|
|
307
|
+
if (Array.isArray(result)) {
|
|
308
|
+
return result;
|
|
309
|
+
}
|
|
310
|
+
else if (typeof result === "object") {
|
|
311
|
+
return Object.entries(result).map(([id, data]) => ({
|
|
312
|
+
id,
|
|
313
|
+
...data,
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
return [];
|
|
317
|
+
}
|
|
318
|
+
async consentsDelete(user, ids) {
|
|
319
|
+
for (const id of ids) {
|
|
320
|
+
await this.request("DELETE", `/api/v1/consents/${encodeURIComponent(user)}/${encodeURIComponent(id)}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
async execScript(_scriptName, _args) {
|
|
324
|
+
throw new Error("execScript is not supported via API. Use SSH or K8s mode.");
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/transport/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface SessionGetOptions {
|
|
2
|
+
backend?: string;
|
|
3
|
+
refreshTokens?: boolean;
|
|
4
|
+
persistent?: boolean;
|
|
5
|
+
hash?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface SessionDeleteOptions extends SessionGetOptions {
|
|
8
|
+
where?: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
export interface SessionFilter {
|
|
11
|
+
where?: Record<string, string>;
|
|
12
|
+
select?: string[];
|
|
13
|
+
backend?: string;
|
|
14
|
+
count?: boolean;
|
|
15
|
+
refreshTokens?: boolean;
|
|
16
|
+
persistent?: boolean;
|
|
17
|
+
hash?: boolean;
|
|
18
|
+
idOnly?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ConfigInfo {
|
|
21
|
+
cfgNum: number;
|
|
22
|
+
cfgAuthor: string;
|
|
23
|
+
cfgDate: string;
|
|
24
|
+
cfgLog?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ILlngTransport {
|
|
27
|
+
configInfo(): Promise<ConfigInfo>;
|
|
28
|
+
configGet(keys: string[]): Promise<Record<string, any>>;
|
|
29
|
+
configSet(pairs: Record<string, any>, log?: string): Promise<void>;
|
|
30
|
+
configAddKey(key: string, subkey: string, value: string): Promise<void>;
|
|
31
|
+
configDelKey(key: string, subkey: string): Promise<void>;
|
|
32
|
+
configSave(): Promise<string>;
|
|
33
|
+
configRestore(json: string): Promise<void>;
|
|
34
|
+
configMerge(json: string): Promise<void>;
|
|
35
|
+
configRollback(): Promise<void>;
|
|
36
|
+
configUpdateCache(): Promise<void>;
|
|
37
|
+
configTestEmail(destination: string): Promise<void>;
|
|
38
|
+
sessionGet(id: string, options?: SessionGetOptions): Promise<Record<string, any>>;
|
|
39
|
+
sessionSearch(filters: SessionFilter): Promise<any[]>;
|
|
40
|
+
sessionDelete(ids: string[], options?: SessionDeleteOptions): Promise<void>;
|
|
41
|
+
sessionSetKey(id: string, pairs: Record<string, any>, options?: SessionGetOptions): Promise<void>;
|
|
42
|
+
sessionDelKey(id: string, keys: string[], options?: SessionGetOptions): Promise<void>;
|
|
43
|
+
sessionBackup(backend?: string, refreshTokens?: boolean, persistent?: boolean): Promise<string>;
|
|
44
|
+
secondFactorsGet(user: string): Promise<any[]>;
|
|
45
|
+
secondFactorsDelete(user: string, ids: string[]): Promise<void>;
|
|
46
|
+
secondFactorsDelType(user: string, type: string): Promise<void>;
|
|
47
|
+
consentsGet(user: string): Promise<any[]>;
|
|
48
|
+
consentsDelete(user: string, ids: string[]): Promise<void>;
|
|
49
|
+
execScript(scriptName: string, args: string[]): Promise<string>;
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/transport/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { K8sConfig } from "../config.js";
|
|
2
|
+
import { ILlngTransport, SessionFilter, ConfigInfo, SessionGetOptions, SessionDeleteOptions } from "./interface.js";
|
|
3
|
+
export declare class K8sTransport implements ILlngTransport {
|
|
4
|
+
private config;
|
|
5
|
+
private paths;
|
|
6
|
+
private cachedPodName;
|
|
7
|
+
constructor(config: K8sConfig);
|
|
8
|
+
private resolvePod;
|
|
9
|
+
private kubectl;
|
|
10
|
+
private kubectlWithStdin;
|
|
11
|
+
private buildExecArgs;
|
|
12
|
+
private buildExecStdinArgs;
|
|
13
|
+
private exec;
|
|
14
|
+
private execWithStdin;
|
|
15
|
+
private execCli;
|
|
16
|
+
private execSessions;
|
|
17
|
+
private pushSessionGetOptions;
|
|
18
|
+
configInfo(): Promise<ConfigInfo>;
|
|
19
|
+
configGet(keys: string[]): Promise<Record<string, any>>;
|
|
20
|
+
configSet(pairs: Record<string, any>, log?: string): Promise<void>;
|
|
21
|
+
configAddKey(key: string, subkey: string, value: string): Promise<void>;
|
|
22
|
+
configDelKey(key: string, subkey: string): Promise<void>;
|
|
23
|
+
configSave(): Promise<string>;
|
|
24
|
+
configRestore(json: string): Promise<void>;
|
|
25
|
+
configMerge(json: string): Promise<void>;
|
|
26
|
+
configRollback(): Promise<void>;
|
|
27
|
+
configUpdateCache(): Promise<void>;
|
|
28
|
+
configTestEmail(destination: string): Promise<void>;
|
|
29
|
+
sessionGet(id: string, options?: SessionGetOptions): Promise<Record<string, any>>;
|
|
30
|
+
sessionSearch(filters: SessionFilter): Promise<any[]>;
|
|
31
|
+
sessionDelete(ids: string[], options?: SessionDeleteOptions): Promise<void>;
|
|
32
|
+
sessionSetKey(id: string, pairs: Record<string, any>, options?: SessionGetOptions): Promise<void>;
|
|
33
|
+
sessionDelKey(id: string, keys: string[], options?: SessionGetOptions): Promise<void>;
|
|
34
|
+
sessionBackup(backend?: string, refreshTokens?: boolean, persistent?: boolean): Promise<string>;
|
|
35
|
+
secondFactorsGet(_user: string): Promise<any[]>;
|
|
36
|
+
secondFactorsDelete(_user: string, _ids: string[]): Promise<void>;
|
|
37
|
+
secondFactorsDelType(_user: string, _type: string): Promise<void>;
|
|
38
|
+
consentsGet(_user: string): Promise<any[]>;
|
|
39
|
+
consentsDelete(_user: string, _ids: string[]): Promise<void>;
|
|
40
|
+
execScript(scriptName: string, args: string[]): Promise<string>;
|
|
41
|
+
}
|