@rockster/logger 0.0.3 → 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.
Files changed (55) hide show
  1. package/config/remote-persist.config.d.ts +14 -0
  2. package/config/remote-persist.config.js +55 -0
  3. package/config/remote-persist.config.js.map +1 -0
  4. package/env.js +16 -6
  5. package/env.js.map +1 -1
  6. package/functions/dispatch-log.d.ts +2 -0
  7. package/functions/dispatch-log.js +17 -0
  8. package/functions/dispatch-log.js.map +1 -0
  9. package/functions/enable-console.js +0 -4
  10. package/functions/enable-console.js.map +1 -1
  11. package/functions/get-error-infos.d.ts +2 -2
  12. package/functions/get-error-infos.js +40 -13
  13. package/functions/get-error-infos.js.map +1 -1
  14. package/functions/index.d.ts +3 -0
  15. package/functions/index.js +3 -0
  16. package/functions/index.js.map +1 -1
  17. package/functions/log-level.d.ts +7 -0
  18. package/functions/log-level.js +42 -0
  19. package/functions/log-level.js.map +1 -0
  20. package/functions/merge-log-extras.d.ts +3 -0
  21. package/functions/merge-log-extras.js +31 -0
  22. package/functions/merge-log-extras.js.map +1 -0
  23. package/functions/parse-bulk-index-response.d.ts +4 -0
  24. package/functions/parse-bulk-index-response.js +40 -0
  25. package/functions/parse-bulk-index-response.js.map +1 -0
  26. package/functions/probe-log-store.d.ts +12 -0
  27. package/functions/probe-log-store.js +182 -0
  28. package/functions/probe-log-store.js.map +1 -0
  29. package/functions/serialize-log-for-persist.d.ts +4 -0
  30. package/functions/serialize-log-for-persist.js +54 -0
  31. package/functions/serialize-log-for-persist.js.map +1 -0
  32. package/functions/write-log-store-status.d.ts +5 -0
  33. package/functions/write-log-store-status.js +50 -0
  34. package/functions/write-log-store-status.js.map +1 -0
  35. package/index.d.ts +4 -0
  36. package/index.js +4 -0
  37. package/index.js.map +1 -1
  38. package/interfaces/log.d.ts +16 -0
  39. package/interfaces/log.js.map +1 -1
  40. package/logger.d.ts +9 -4
  41. package/logger.js +22 -9
  42. package/logger.js.map +1 -1
  43. package/package.json +33 -33
  44. package/services/log-runtime.service.d.ts +65 -0
  45. package/services/log-runtime.service.js +397 -0
  46. package/services/log-runtime.service.js.map +1 -0
  47. package/services/opensearch-client.d.ts +14 -0
  48. package/services/opensearch-client.js +113 -0
  49. package/services/opensearch-client.js.map +1 -0
  50. package/services/remote-persist.service.d.ts +31 -0
  51. package/services/remote-persist.service.js +261 -0
  52. package/services/remote-persist.service.js.map +1 -0
  53. package/stdout-writer.d.ts +6 -5
  54. package/stdout-writer.js +49 -46
  55. package/stdout-writer.js.map +1 -1
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLogRuntime = exports.initLogRuntime = exports.LogRuntimeService = exports.RetentionJob = exports.HookEngine = exports.SettingsJob = void 0;
4
+ require("colors");
5
+ const logs_1 = require("@rockster/common/logs");
6
+ const query_builder_1 = require("@rockster/common/query-builder");
7
+ const verify_generate_signature_1 = require("@rockster/common/auth/verify-generate-signature");
8
+ const log_level_1 = require("../functions/log-level");
9
+ const opensearch_client_1 = require("./opensearch-client");
10
+ const prefix = () => '[RocksterLogger]'.cyan;
11
+ const writeInfo = (headline, details) => {
12
+ console.log(`${prefix()} ${headline}`);
13
+ if (details === null || details === void 0 ? void 0 : details.length) {
14
+ for (const line of details) {
15
+ console.log(` ${line}`);
16
+ }
17
+ }
18
+ };
19
+ const writeWarn = (headline, details) => {
20
+ console.warn(`${prefix()} ${headline.yellow}`);
21
+ if (details === null || details === void 0 ? void 0 : details.length) {
22
+ for (const line of details) {
23
+ console.warn(` ${line}`);
24
+ }
25
+ }
26
+ };
27
+ const RELOAD_MS = 60 * 1000;
28
+ const HOOK_TIMEOUT_MS = 5000;
29
+ const DEFAULT_WINDOW_MINUTES = 5;
30
+ const appIdTermFilter = (appId) => ({
31
+ bool: {
32
+ should: [
33
+ { term: { 'appId.keyword': appId } },
34
+ { term: { appId } },
35
+ ],
36
+ minimum_should_match: 1,
37
+ },
38
+ });
39
+ const defaultSettings = (appId) => ({
40
+ appId,
41
+ clearInterval: logs_1.LogClearInterval.days_30,
42
+ logLevel: (0, log_level_1.getLogLevelFromEnv)(),
43
+ });
44
+ const parseSettingsSource = (id, source) => {
45
+ var _a, _b, _c;
46
+ if (!source) {
47
+ return null;
48
+ }
49
+ const isGlobal = id === logs_1.LOG_SETTINGS_GLOBAL_ID || !source.appId;
50
+ return {
51
+ id,
52
+ appId: isGlobal ? null : String((_a = source.appId) !== null && _a !== void 0 ? _a : id),
53
+ clearInterval: (_b = source.clearInterval) !== null && _b !== void 0 ? _b : logs_1.LogClearInterval.days_30,
54
+ logLevel: (_c = source.logLevel) !== null && _c !== void 0 ? _c : logs_1.LogLevel.info,
55
+ date: source.date,
56
+ };
57
+ };
58
+ const mergeSettings = (configAppId, globalSettings, appSettings) => {
59
+ var _a, _b;
60
+ const base = globalSettings !== null && globalSettings !== void 0 ? globalSettings : defaultSettings(configAppId);
61
+ if (!appSettings) {
62
+ return Object.assign(Object.assign({}, base), { appId: configAppId });
63
+ }
64
+ return {
65
+ id: appSettings.id,
66
+ appId: configAppId,
67
+ clearInterval: (_a = appSettings.clearInterval) !== null && _a !== void 0 ? _a : base.clearInterval,
68
+ logLevel: (_b = appSettings.logLevel) !== null && _b !== void 0 ? _b : base.logLevel,
69
+ date: appSettings.date,
70
+ };
71
+ };
72
+ class SettingsJob {
73
+ constructor(config) {
74
+ this.config = config;
75
+ this.lastLoggedSignature = null;
76
+ this.client = new opensearch_client_1.OpenSearchClient(config);
77
+ this.settings = defaultSettings(config.appId);
78
+ }
79
+ async load() {
80
+ var _a, _b;
81
+ try {
82
+ await this.client.ensureIndex(this.config.settingsIndex);
83
+ const globalSource = await this.client.getDocument(this.config.settingsIndex, logs_1.LOG_SETTINGS_GLOBAL_ID);
84
+ let appSource = await this.client.getDocument(this.config.settingsIndex, this.config.appId);
85
+ if (!appSource) {
86
+ const legacy = await this.client.search(this.config.settingsIndex, {
87
+ size: 1,
88
+ query: appIdTermFilter(this.config.appId),
89
+ });
90
+ const hit = ((_b = (_a = legacy.hits) === null || _a === void 0 ? void 0 : _a.hits) !== null && _b !== void 0 ? _b : [])[0];
91
+ if ((hit === null || hit === void 0 ? void 0 : hit._source) && hit._id !== logs_1.LOG_SETTINGS_GLOBAL_ID) {
92
+ appSource = hit._source;
93
+ }
94
+ }
95
+ const globalSettings = parseSettingsSource(logs_1.LOG_SETTINGS_GLOBAL_ID, globalSource);
96
+ const appSettings = parseSettingsSource(this.config.appId, appSource);
97
+ this.settings = mergeSettings(this.config.appId, globalSettings, appSettings);
98
+ (0, log_level_1.setRuntimeLogLevel)(this.settings.logLevel);
99
+ const signature = [
100
+ this.config.index,
101
+ this.config.appId,
102
+ this.settings.clearInterval,
103
+ this.settings.logLevel,
104
+ ].join('|');
105
+ if (signature !== this.lastLoggedSignature) {
106
+ this.lastLoggedSignature = signature;
107
+ writeInfo('Runtime log settings applied'.green.bold.toString(), [
108
+ `index: ${this.config.index.yellow}`,
109
+ `appId: ${this.config.appId.yellow}`,
110
+ `clearInterval: ${String(this.settings.clearInterval).yellow}`,
111
+ `logLevel: ${String(this.settings.logLevel).yellow}`,
112
+ ]);
113
+ }
114
+ }
115
+ catch (_c) {
116
+ }
117
+ }
118
+ }
119
+ exports.SettingsJob = SettingsJob;
120
+ class HookEngine {
121
+ constructor(config) {
122
+ this.config = config;
123
+ this.hooks = [];
124
+ this.buffers = new Map();
125
+ this.ready = Promise.resolve();
126
+ this.lastLoggedSignature = null;
127
+ this.client = new opensearch_client_1.OpenSearchClient(config);
128
+ }
129
+ start() {
130
+ }
131
+ async reload() {
132
+ this.ready = (async () => {
133
+ var _a, _b;
134
+ try {
135
+ await this.client.ensureIndex(this.config.hooksIndex);
136
+ await this.client.ensureIndex(this.config.eventsIndex);
137
+ const response = await this.client.search(this.config.hooksIndex, {
138
+ size: 200,
139
+ query: {
140
+ bool: {
141
+ must: [
142
+ appIdTermFilter(this.config.appId),
143
+ { term: { enabled: true } },
144
+ ],
145
+ },
146
+ },
147
+ });
148
+ const hits = (_b = ((_a = response.hits) === null || _a === void 0 ? void 0 : _a.hits)) !== null && _b !== void 0 ? _b : [];
149
+ this.hooks = hits
150
+ .map((hit) => { var _a, _b, _c; return this.compileHook((_c = (_a = hit._id) !== null && _a !== void 0 ? _a : (_b = hit._source) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : '', hit._source); })
151
+ .filter((hook) => Boolean(hook));
152
+ const hookIds = this.hooks.map((h) => h.id).sort();
153
+ const signature = [
154
+ this.config.index,
155
+ this.config.hooksIndex,
156
+ this.config.appId,
157
+ hookIds.join(','),
158
+ ].join('|');
159
+ if (signature !== this.lastLoggedSignature) {
160
+ this.lastLoggedSignature = signature;
161
+ writeInfo(`Loaded ${this.hooks.length} log hook(s)`, [
162
+ `index: ${this.config.index}`,
163
+ `hooksIndex: ${this.config.hooksIndex}`,
164
+ `appId: ${this.config.appId}`,
165
+ `hooks: ${hookIds.length ? hookIds.join(', ') : '—'}`,
166
+ ]);
167
+ }
168
+ }
169
+ catch (error) {
170
+ this.hooks = [];
171
+ const message = error instanceof Error ? error.message : String(error);
172
+ writeWarn('Log hooks reload failed', [
173
+ `index: ${this.config.index}`,
174
+ `hooksIndex: ${this.config.hooksIndex}`,
175
+ `appId: ${this.config.appId}`,
176
+ `error: ${message}`,
177
+ ]);
178
+ }
179
+ })();
180
+ await this.ready;
181
+ }
182
+ compileHook(id, source) {
183
+ var _a, _b, _c, _d;
184
+ if (!(source === null || source === void 0 ? void 0 : source.url)) {
185
+ return null;
186
+ }
187
+ const hook = Object.assign(Object.assign({}, source), { id: source.id || id, appId: source.appId || this.config.appId });
188
+ const conditionHandle = (_a = hook.conditionQueryAsHandle) !== null && _a !== void 0 ? _a : (((_b = hook.conditionQuery) === null || _b === void 0 ? void 0 : _b.queryValue)
189
+ ? (0, query_builder_1.buildQueryAsHandle)(hook.conditionQuery.queryValue)
190
+ : undefined);
191
+ const aggregatorHandle = (_c = hook.aggregatorQueryAsHandle) !== null && _c !== void 0 ? _c : (((_d = hook.aggregatorQuery) === null || _d === void 0 ? void 0 : _d.queryValue)
192
+ ? (0, query_builder_1.buildQueryAsHandle)(hook.aggregatorQuery.queryValue)
193
+ : undefined);
194
+ return Object.assign(Object.assign({}, hook), { matchCondition: (log) => {
195
+ var _a;
196
+ if (hook.conditionMode === logs_1.LogHookConditionMode.type) {
197
+ return ((_a = hook.logTypes) !== null && _a !== void 0 ? _a : []).some((type) => String(type) === String(log.type));
198
+ }
199
+ return (0, query_builder_1.evaluateQueryHandle)(log, conditionHandle);
200
+ }, shouldDispatch: (state) => (0, query_builder_1.evaluateQueryHandle)(state, aggregatorHandle) });
201
+ }
202
+ onLog(log) {
203
+ void this.ready.then(() => {
204
+ this.processLog(log);
205
+ });
206
+ }
207
+ processLog(log) {
208
+ var _a;
209
+ for (const hook of this.hooks) {
210
+ if (!hook.matchCondition(log)) {
211
+ continue;
212
+ }
213
+ const groupKey = hook.groupByField
214
+ ? String((_a = log[hook.groupByField]) !== null && _a !== void 0 ? _a : 'default')
215
+ : 'default';
216
+ let hookBuffers = this.buffers.get(hook.id);
217
+ if (!hookBuffers) {
218
+ hookBuffers = new Map();
219
+ this.buffers.set(hook.id, hookBuffers);
220
+ }
221
+ let buffer = hookBuffers.get(groupKey);
222
+ if (!buffer) {
223
+ buffer = { logs: [], startedAt: Date.now() };
224
+ hookBuffers.set(groupKey, buffer);
225
+ }
226
+ buffer.logs.push(log);
227
+ const windowMinutes = (Date.now() - buffer.startedAt) / 60000;
228
+ const shouldFire = hook.shouldDispatch({
229
+ count: buffer.logs.length,
230
+ windowMinutes,
231
+ }) || (!hook.aggregatorQuery && !hook.aggregatorQueryAsHandle
232
+ ? buffer.logs.length >= 1
233
+ : false);
234
+ if (!shouldFire) {
235
+ if (windowMinutes > (DEFAULT_WINDOW_MINUTES * 2)) {
236
+ buffer.logs = buffer.logs.slice(-1);
237
+ buffer.startedAt = Date.now();
238
+ }
239
+ continue;
240
+ }
241
+ const logsToSend = [...buffer.logs];
242
+ buffer.logs = [];
243
+ buffer.startedAt = Date.now();
244
+ void this.dispatch(hook, logsToSend, groupKey);
245
+ }
246
+ }
247
+ async dispatch(hook, logs, aggregationKey) {
248
+ if (logs.length === 0) {
249
+ return;
250
+ }
251
+ const firedAt = new Date().toISOString();
252
+ const eventId = `${hook.id}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
253
+ const body = JSON.stringify({
254
+ hook_id: hook.id,
255
+ logs,
256
+ count: logs.length,
257
+ fired_at: firedAt,
258
+ aggregation_key: aggregationKey,
259
+ });
260
+ const signature = (0, verify_generate_signature_1.generateSignature)({
261
+ username: this.config.username,
262
+ secret: this.config.password,
263
+ canonicals: [hook.url],
264
+ });
265
+ try {
266
+ await fetch(hook.url, {
267
+ method: 'POST',
268
+ headers: {
269
+ 'Content-Type': 'application/json',
270
+ [signature.header]: signature.value,
271
+ },
272
+ body,
273
+ signal: AbortSignal.timeout(HOOK_TIMEOUT_MS),
274
+ });
275
+ }
276
+ catch (_a) {
277
+ }
278
+ try {
279
+ await this.client.indexDocument(this.config.eventsIndex, eventId, {
280
+ hookId: hook.id,
281
+ appId: this.config.appId,
282
+ date: firedAt,
283
+ firedAt,
284
+ count: logs.length,
285
+ logs,
286
+ aggregationKey,
287
+ read: false,
288
+ });
289
+ }
290
+ catch (_b) {
291
+ }
292
+ }
293
+ }
294
+ exports.HookEngine = HookEngine;
295
+ class RetentionJob {
296
+ constructor(config, settingsJob) {
297
+ this.config = config;
298
+ this.settingsJob = settingsJob;
299
+ this.dailyTimer = null;
300
+ this.client = new opensearch_client_1.OpenSearchClient(config);
301
+ }
302
+ start() {
303
+ var _a, _b;
304
+ void this.run();
305
+ this.dailyTimer = setInterval(() => {
306
+ void this.run();
307
+ }, 24 * 60 * 60 * 1000);
308
+ (_b = (_a = this.dailyTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
309
+ }
310
+ stop() {
311
+ if (this.dailyTimer) {
312
+ clearInterval(this.dailyTimer);
313
+ this.dailyTimer = null;
314
+ }
315
+ }
316
+ async run() {
317
+ const daysMap = {
318
+ days_7: 7,
319
+ days_30: 30,
320
+ days_90: 90,
321
+ never: null,
322
+ };
323
+ const days = daysMap[this.settingsJob.settings.clearInterval];
324
+ if (!days) {
325
+ return;
326
+ }
327
+ const cutoff = new Date();
328
+ cutoff.setDate(cutoff.getDate() - days);
329
+ await this.client.deleteByQuery(this.config.index, {
330
+ query: {
331
+ bool: {
332
+ must: [
333
+ {
334
+ bool: {
335
+ should: [
336
+ { term: { 'appId.keyword': this.config.appId } },
337
+ { term: { appId: this.config.appId } },
338
+ ],
339
+ minimum_should_match: 1,
340
+ },
341
+ },
342
+ {
343
+ range: {
344
+ date: { lt: cutoff.toISOString() },
345
+ },
346
+ },
347
+ ],
348
+ },
349
+ },
350
+ });
351
+ }
352
+ }
353
+ exports.RetentionJob = RetentionJob;
354
+ class LogRuntimeService {
355
+ constructor(config) {
356
+ this.config = config;
357
+ this.reloadTimer = null;
358
+ this.client = new opensearch_client_1.OpenSearchClient(config);
359
+ this.settingsJob = new SettingsJob(config);
360
+ this.hookEngine = new HookEngine(config);
361
+ this.retentionJob = new RetentionJob(config, this.settingsJob);
362
+ }
363
+ start() {
364
+ var _a, _b;
365
+ void this.reloadAll();
366
+ this.retentionJob.start();
367
+ this.reloadTimer = setInterval(() => {
368
+ void this.reloadAll();
369
+ }, RELOAD_MS);
370
+ (_b = (_a = this.reloadTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
371
+ }
372
+ async registerApp() {
373
+ await this.client.registerApp(this.config.appId);
374
+ }
375
+ async reloadAll() {
376
+ await Promise.all([
377
+ this.settingsJob.load(),
378
+ this.hookEngine.reload(),
379
+ ]);
380
+ }
381
+ onLog(log) {
382
+ this.hookEngine.onLog(log);
383
+ }
384
+ }
385
+ exports.LogRuntimeService = LogRuntimeService;
386
+ let logRuntimeInstance = null;
387
+ const initLogRuntime = (config) => {
388
+ if (!logRuntimeInstance) {
389
+ logRuntimeInstance = new LogRuntimeService(config);
390
+ logRuntimeInstance.start();
391
+ }
392
+ return logRuntimeInstance;
393
+ };
394
+ exports.initLogRuntime = initLogRuntime;
395
+ const getLogRuntime = () => logRuntimeInstance;
396
+ exports.getLogRuntime = getLogRuntime;
397
+ //# sourceMappingURL=log-runtime.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-runtime.service.js","sourceRoot":"","sources":["../../services/log-runtime.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { RemotePersistConfig } from '../config/remote-persist.config';
2
+ export declare class OpenSearchClient {
3
+ protected config: RemotePersistConfig;
4
+ constructor(config: RemotePersistConfig);
5
+ getAuthHeader(): string;
6
+ request(path: string, options?: RequestInit): Promise<Response>;
7
+ ensureIndex(indexName: string): Promise<void>;
8
+ search(indexName: string, body: Record<string, unknown>): Promise<Record<string, unknown>>;
9
+ getDocument(indexName: string, id: string): Promise<Record<string, unknown> | null>;
10
+ indexDocument(indexName: string, id: string, document: Record<string, unknown>): Promise<boolean>;
11
+ deleteDocument(indexName: string, id: string): Promise<boolean>;
12
+ deleteByQuery(indexName: string, body: Record<string, unknown>): Promise<boolean>;
13
+ registerApp(appId: string): Promise<void>;
14
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenSearchClient = void 0;
4
+ const CONNECT_TIMEOUT_MS = 10000;
5
+ const buildMappings = (indexName) => {
6
+ if (indexName.endsWith('-apps')) {
7
+ return {
8
+ properties: {
9
+ appId: { type: 'keyword' },
10
+ date: { type: 'date' },
11
+ },
12
+ };
13
+ }
14
+ if (indexName.endsWith('-settings')
15
+ || indexName.endsWith('-hooks')
16
+ || indexName.endsWith('-events')) {
17
+ return {
18
+ properties: {
19
+ appId: { type: 'keyword' },
20
+ hookId: { type: 'keyword' },
21
+ date: { type: 'date' },
22
+ firedAt: { type: 'date' },
23
+ read: { type: 'boolean' },
24
+ readBy: { type: 'keyword' },
25
+ enabled: { type: 'boolean' },
26
+ url: { type: 'keyword' },
27
+ clearInterval: { type: 'keyword' },
28
+ logLevel: { type: 'keyword' },
29
+ name: { type: 'keyword' },
30
+ displayName: { type: 'keyword' },
31
+ },
32
+ };
33
+ }
34
+ return undefined;
35
+ };
36
+ class OpenSearchClient {
37
+ constructor(config) {
38
+ this.config = config;
39
+ }
40
+ getAuthHeader() {
41
+ return `Basic ${Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64')}`;
42
+ }
43
+ async request(path, options = {}) {
44
+ var _a, _b;
45
+ const url = `${this.config.url}${path.startsWith('/') ? path : `/${path}`}`;
46
+ return fetch(url, Object.assign(Object.assign({}, options), { headers: Object.assign({ Authorization: this.getAuthHeader(), 'Content-Type': 'application/json' }, ((_a = options.headers) !== null && _a !== void 0 ? _a : {})), signal: (_b = options.signal) !== null && _b !== void 0 ? _b : AbortSignal.timeout(CONNECT_TIMEOUT_MS) }));
47
+ }
48
+ async ensureIndex(indexName) {
49
+ const response = await this.request(`/${indexName}`, { method: 'HEAD' });
50
+ if (response.ok || response.status === 404) {
51
+ if (response.status === 404) {
52
+ const mappings = buildMappings(indexName);
53
+ await this.request(`/${indexName}`, {
54
+ method: 'PUT',
55
+ body: JSON.stringify(mappings ? { mappings } : {}),
56
+ });
57
+ }
58
+ }
59
+ }
60
+ async search(indexName, body) {
61
+ const response = await this.request(`/${indexName}/_search`, {
62
+ method: 'POST',
63
+ body: JSON.stringify(body),
64
+ });
65
+ if (!response.ok) {
66
+ throw new Error(`OpenSearch search failed (${response.status})`);
67
+ }
68
+ return response.json();
69
+ }
70
+ async getDocument(indexName, id) {
71
+ var _a;
72
+ const response = await this.request(`/${indexName}/_doc/${encodeURIComponent(id)}`, {
73
+ method: 'GET',
74
+ });
75
+ if (response.status === 404) {
76
+ return null;
77
+ }
78
+ if (!response.ok) {
79
+ throw new Error(`OpenSearch get failed (${response.status})`);
80
+ }
81
+ const payload = await response.json();
82
+ return (_a = payload._source) !== null && _a !== void 0 ? _a : null;
83
+ }
84
+ async indexDocument(indexName, id, document) {
85
+ const response = await this.request(`/${indexName}/_doc/${encodeURIComponent(id)}`, {
86
+ method: 'PUT',
87
+ body: JSON.stringify(document),
88
+ });
89
+ return response.ok;
90
+ }
91
+ async deleteDocument(indexName, id) {
92
+ const response = await this.request(`/${indexName}/_doc/${encodeURIComponent(id)}`, {
93
+ method: 'DELETE',
94
+ });
95
+ return response.ok || response.status === 404;
96
+ }
97
+ async deleteByQuery(indexName, body) {
98
+ const response = await this.request(`/${indexName}/_delete_by_query?conflicts=proceed`, {
99
+ method: 'POST',
100
+ body: JSON.stringify(body),
101
+ });
102
+ return response.ok;
103
+ }
104
+ async registerApp(appId) {
105
+ await this.ensureIndex(this.config.appsIndex);
106
+ await this.indexDocument(this.config.appsIndex, appId, {
107
+ appId,
108
+ date: new Date().toISOString(),
109
+ });
110
+ }
111
+ }
112
+ exports.OpenSearchClient = OpenSearchClient;
113
+ //# sourceMappingURL=opensearch-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opensearch-client.js","sourceRoot":"","sources":["../../services/opensearch-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { RemotePersistConfig } from '../config/remote-persist.config';
2
+ import { ILogPersisted, Log } from '../interfaces';
3
+ type BulkSendResult = {
4
+ failed: ILogPersisted[];
5
+ };
6
+ export declare class RemotePersistService {
7
+ protected config: RemotePersistConfig;
8
+ protected queue: ILogPersisted[];
9
+ protected flushTimer: ReturnType<typeof setTimeout> | null;
10
+ protected retryTimer: ReturnType<typeof setInterval> | null;
11
+ protected flushing: boolean;
12
+ protected shutdownRegistered: boolean;
13
+ protected connected: boolean | null;
14
+ constructor(config: RemotePersistConfig);
15
+ verifyConnection(): Promise<boolean>;
16
+ protected reportStartupStatus(): Promise<void>;
17
+ protected getAuthHeader(): string;
18
+ enqueue(log: Log): void;
19
+ protected scheduleFlush(immediate?: boolean): void;
20
+ protected flushQueue(): Promise<void>;
21
+ protected retrySpool(): Promise<void>;
22
+ protected claimSpoolDocuments(): Promise<ILogPersisted[]>;
23
+ protected sendBulk(documents: ILogPersisted[]): Promise<BulkSendResult>;
24
+ protected appendSpool(documents: ILogPersisted[]): Promise<void>;
25
+ protected ensureSpoolDir(): void;
26
+ protected registerShutdown(): void;
27
+ protected shutdownFlush(): Promise<void>;
28
+ }
29
+ export declare const initRemotePersist: () => RemotePersistService | null;
30
+ export declare const getRemotePersist: () => RemotePersistService | null;
31
+ export {};