@trufnetwork/sdk-js 0.3.8 → 0.4.2

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 (78) hide show
  1. package/dist/cjs/client/client.cjs +44 -0
  2. package/dist/cjs/client/client.cjs.map +2 -2
  3. package/dist/cjs/contracts-api/action.cjs +301 -77
  4. package/dist/cjs/contracts-api/action.cjs.map +3 -3
  5. package/dist/cjs/contracts-api/cache.integration.test.cjs +265 -0
  6. package/dist/cjs/contracts-api/cache.integration.test.cjs.map +7 -0
  7. package/dist/cjs/contracts-api/composedAction.cjs +86 -0
  8. package/dist/cjs/contracts-api/composedAction.cjs.map +2 -2
  9. package/dist/cjs/contracts-api/composedAction.test.cjs +301 -0
  10. package/dist/cjs/contracts-api/composedAction.test.cjs.map +7 -0
  11. package/dist/cjs/index.common.cjs.map +1 -1
  12. package/dist/cjs/types/cache.cjs +34 -0
  13. package/dist/cjs/types/cache.cjs.map +7 -0
  14. package/dist/cjs/types/cache.test.cjs +205 -0
  15. package/dist/cjs/types/cache.test.cjs.map +7 -0
  16. package/dist/cjs/util/cacheMetadataParser.cjs +174 -0
  17. package/dist/cjs/util/cacheMetadataParser.cjs.map +7 -0
  18. package/dist/cjs/util/cacheMetadataParser.test.cjs +329 -0
  19. package/dist/cjs/util/cacheMetadataParser.test.cjs.map +7 -0
  20. package/dist/cjs/util/cacheValidation.cjs +88 -0
  21. package/dist/cjs/util/cacheValidation.cjs.map +7 -0
  22. package/dist/cjs/util/cacheValidation.test.cjs +108 -0
  23. package/dist/cjs/util/cacheValidation.test.cjs.map +7 -0
  24. package/dist/esm/client/client.mjs +44 -0
  25. package/dist/esm/client/client.mjs.map +2 -2
  26. package/dist/esm/contracts-api/action.mjs +302 -77
  27. package/dist/esm/contracts-api/action.mjs.map +3 -3
  28. package/dist/esm/contracts-api/cache.integration.test.mjs +263 -0
  29. package/dist/esm/contracts-api/cache.integration.test.mjs.map +7 -0
  30. package/dist/esm/contracts-api/composedAction.mjs +86 -0
  31. package/dist/esm/contracts-api/composedAction.mjs.map +2 -2
  32. package/dist/esm/contracts-api/composedAction.test.mjs +299 -0
  33. package/dist/esm/contracts-api/composedAction.test.mjs.map +7 -0
  34. package/dist/esm/index.common.mjs.map +1 -1
  35. package/dist/esm/types/cache.mjs +13 -0
  36. package/dist/esm/types/cache.mjs.map +7 -0
  37. package/dist/esm/types/cache.test.mjs +203 -0
  38. package/dist/esm/types/cache.test.mjs.map +7 -0
  39. package/dist/esm/util/cacheMetadataParser.mjs +153 -0
  40. package/dist/esm/util/cacheMetadataParser.mjs.map +7 -0
  41. package/dist/esm/util/cacheMetadataParser.test.mjs +327 -0
  42. package/dist/esm/util/cacheMetadataParser.test.mjs.map +7 -0
  43. package/dist/esm/util/cacheValidation.mjs +67 -0
  44. package/dist/esm/util/cacheValidation.mjs.map +7 -0
  45. package/dist/esm/util/cacheValidation.test.mjs +106 -0
  46. package/dist/esm/util/cacheValidation.test.mjs.map +7 -0
  47. package/dist/tsconfig.build.tsbuildinfo +1 -1
  48. package/dist/types/client/client.d.ts +39 -1
  49. package/dist/types/client/client.d.ts.map +1 -1
  50. package/dist/types/contracts-api/action.d.ts +11 -1
  51. package/dist/types/contracts-api/action.d.ts.map +1 -1
  52. package/dist/types/contracts-api/cache.integration.test.d.ts +2 -0
  53. package/dist/types/contracts-api/cache.integration.test.d.ts.map +1 -0
  54. package/dist/types/contracts-api/composedAction.d.ts +75 -0
  55. package/dist/types/contracts-api/composedAction.d.ts.map +1 -1
  56. package/dist/types/contracts-api/composedAction.test.d.ts +2 -0
  57. package/dist/types/contracts-api/composedAction.test.d.ts.map +1 -0
  58. package/dist/types/index.common.d.ts +1 -1
  59. package/dist/types/index.common.d.ts.map +1 -1
  60. package/dist/types/types/cache.d.ts +129 -0
  61. package/dist/types/types/cache.d.ts.map +1 -0
  62. package/dist/types/types/cache.test.d.ts +2 -0
  63. package/dist/types/types/cache.test.d.ts.map +1 -0
  64. package/dist/types/util/cacheMetadataParser.d.ts +38 -0
  65. package/dist/types/util/cacheMetadataParser.d.ts.map +1 -0
  66. package/dist/types/util/cacheMetadataParser.test.d.ts +2 -0
  67. package/dist/types/util/cacheMetadataParser.test.d.ts.map +1 -0
  68. package/dist/types/util/cacheValidation.d.ts +27 -0
  69. package/dist/types/util/cacheValidation.d.ts.map +1 -0
  70. package/dist/types/util/cacheValidation.test.d.ts +2 -0
  71. package/dist/types/util/cacheValidation.test.d.ts.map +1 -0
  72. package/package.json +5 -3
  73. package/dist/cjs/client/client.test.cjs +0 -32
  74. package/dist/cjs/client/client.test.cjs.map +0 -7
  75. package/dist/esm/client/client.test.mjs +0 -30
  76. package/dist/esm/client/client.test.mjs.map +0 -7
  77. package/dist/types/client/client.test.d.ts +0 -2
  78. package/dist/types/client/client.test.d.ts.map +0 -1
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/util/cacheMetadataParser.ts
21
+ var cacheMetadataParser_exports = {};
22
+ __export(cacheMetadataParser_exports, {
23
+ CacheMetadataParser: () => CacheMetadataParser
24
+ });
25
+ module.exports = __toCommonJS(cacheMetadataParser_exports);
26
+ var CacheMetadataParser = class {
27
+ /**
28
+ * Parses logs and removes prepended numeric prefixes (e.g., "1. ", "2. ")
29
+ * @param logsInput - The logs string or array to parse
30
+ * @returns Array of clean log lines
31
+ */
32
+ static parseLogsForMetadata(logsInput) {
33
+ const logs = [];
34
+ const logArray = Array.isArray(logsInput) ? logsInput : [logsInput];
35
+ for (const log of logArray) {
36
+ if (!log || typeof log !== "string") {
37
+ continue;
38
+ }
39
+ const lines = log.split("\n");
40
+ for (const line of lines) {
41
+ const trimmedLine = line.trim();
42
+ if (!trimmedLine) {
43
+ continue;
44
+ }
45
+ const dotSpaceIndex = trimmedLine.indexOf(". ");
46
+ if (dotSpaceIndex > 0) {
47
+ const prefix = trimmedLine.substring(0, dotSpaceIndex);
48
+ if (/^\d+$/.test(prefix)) {
49
+ const cleanLine = trimmedLine.substring(dotSpaceIndex + 2).trim();
50
+ if (cleanLine) {
51
+ logs.push(cleanLine);
52
+ }
53
+ continue;
54
+ }
55
+ }
56
+ logs.push(trimmedLine);
57
+ }
58
+ }
59
+ return logs;
60
+ }
61
+ /**
62
+ * Extracts cache metadata from action logs
63
+ * @param logs - The action logs returned from the backend (may be a single string or array)
64
+ * @returns Cache metadata if found, null otherwise
65
+ */
66
+ static extractFromLogs(logs) {
67
+ const logLines = this.parseLogsForMetadata(logs);
68
+ for (const line of logLines) {
69
+ if (line.includes("cache_hit")) {
70
+ try {
71
+ const logData = JSON.parse(line);
72
+ if (logData.cache_hit === true) {
73
+ return {
74
+ hit: true,
75
+ cacheDisabled: logData.cache_disabled,
76
+ height: logData.cache_height ? Number(logData.cache_height) : void 0
77
+ };
78
+ }
79
+ if (logData.cache_hit === false) {
80
+ return {
81
+ hit: false,
82
+ cacheDisabled: logData.cache_disabled,
83
+ height: void 0
84
+ };
85
+ }
86
+ } catch (error) {
87
+ continue;
88
+ }
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ /**
94
+ * Validates cache metadata structure
95
+ * @param metadata - The cache metadata to validate
96
+ * @returns True if metadata is valid, false otherwise
97
+ */
98
+ static isValidCacheMetadata(metadata) {
99
+ if (!metadata || typeof metadata !== "object") {
100
+ return false;
101
+ }
102
+ if (typeof metadata.hit !== "boolean") {
103
+ return false;
104
+ }
105
+ if (metadata.cacheDisabled !== void 0 && typeof metadata.cacheDisabled !== "boolean") {
106
+ return false;
107
+ }
108
+ if (metadata.streamId !== void 0 && typeof metadata.streamId !== "string") {
109
+ return false;
110
+ }
111
+ if (metadata.dataProvider !== void 0 && typeof metadata.dataProvider !== "string") {
112
+ return false;
113
+ }
114
+ if (metadata.from !== void 0 && typeof metadata.from !== "number") {
115
+ return false;
116
+ }
117
+ if (metadata.to !== void 0 && typeof metadata.to !== "number") {
118
+ return false;
119
+ }
120
+ if (metadata.frozenAt !== void 0 && typeof metadata.frozenAt !== "number") {
121
+ return false;
122
+ }
123
+ if (metadata.rowsServed !== void 0 && typeof metadata.rowsServed !== "number") {
124
+ return false;
125
+ }
126
+ if (metadata.height !== void 0 && typeof metadata.height !== "number") {
127
+ return false;
128
+ }
129
+ return true;
130
+ }
131
+ /**
132
+ * Extracts cache metadata from Kwil response structure
133
+ * @param response - The full response from Kwil client
134
+ * @returns Cache metadata if found, null otherwise
135
+ */
136
+ static extractFromResponse(response) {
137
+ if (response && response.data && response.data.logs) {
138
+ return this.extractFromLogs(response.data.logs);
139
+ }
140
+ if (response && response.logs) {
141
+ return this.extractFromLogs(response.logs);
142
+ }
143
+ return null;
144
+ }
145
+ /**
146
+ * Aggregates multiple cache metadata entries into a collection
147
+ * @param metadataList - Array of cache metadata entries
148
+ * @returns Aggregated cache metadata collection
149
+ */
150
+ static aggregate(metadataList) {
151
+ const totalQueries = metadataList.length;
152
+ let cacheHits = 0;
153
+ let totalRowsServed = 0;
154
+ for (const metadata of metadataList) {
155
+ if (metadata.hit) {
156
+ cacheHits++;
157
+ }
158
+ if (metadata.rowsServed) {
159
+ totalRowsServed += metadata.rowsServed;
160
+ }
161
+ }
162
+ const cacheMisses = totalQueries - cacheHits;
163
+ const cacheHitRate = totalQueries > 0 ? cacheHits / totalQueries : 0;
164
+ return {
165
+ totalQueries,
166
+ cacheHits,
167
+ cacheMisses,
168
+ cacheHitRate,
169
+ totalRowsServed,
170
+ entries: metadataList
171
+ };
172
+ }
173
+ };
174
+ //# sourceMappingURL=cacheMetadataParser.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/cacheMetadataParser.ts"],
4
+ "sourcesContent": ["import { CacheMetadata, CacheMetadataCollection } from '../types/cache';\n\n/**\n * Parser for extracting cache metadata from action logs\n * Handles the parsing of cache-related information from SQL action responses\n */\nexport class CacheMetadataParser {\n /**\n * Parses logs and removes prepended numeric prefixes (e.g., \"1. \", \"2. \")\n * @param logsInput - The logs string or array to parse\n * @returns Array of clean log lines\n */\n static parseLogsForMetadata(logsInput: string | string[]): string[] {\n const logs: string[] = [];\n const logArray = Array.isArray(logsInput) ? logsInput : [logsInput];\n \n for (const log of logArray) {\n if (!log || typeof log !== 'string') {\n continue;\n }\n \n const lines = log.split('\\n');\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine) {\n continue;\n }\n \n // Check for prepended numeric format (e.g., \"1. \", \"2. \")\n const dotSpaceIndex = trimmedLine.indexOf('. ');\n if (dotSpaceIndex > 0) {\n const prefix = trimmedLine.substring(0, dotSpaceIndex);\n // Check if prefix is a number\n if (/^\\d+$/.test(prefix)) {\n const cleanLine = trimmedLine.substring(dotSpaceIndex + 2).trim();\n if (cleanLine) {\n logs.push(cleanLine);\n }\n continue;\n }\n }\n \n // If no prepended format found, add the line as-is\n logs.push(trimmedLine);\n }\n }\n \n return logs;\n }\n\n /**\n * Extracts cache metadata from action logs\n * @param logs - The action logs returned from the backend (may be a single string or array)\n * @returns Cache metadata if found, null otherwise\n */\n static extractFromLogs(logs: string | string[]): CacheMetadata | null {\n // Parse logs and remove prepended numeric prefixes\n const logLines = this.parseLogsForMetadata(logs);\n \n for (const line of logLines) {\n // Look for cache-related log entries\n if (line.includes('cache_hit')) {\n try {\n // Try to parse as JSON\n const logData = JSON.parse(line);\n \n // Check if this is a cache hit entry\n if (logData.cache_hit === true) {\n return {\n hit: true,\n cacheDisabled: logData.cache_disabled,\n height: logData.cache_height ? Number(logData.cache_height) : undefined\n };\n }\n \n // Cache miss case\n if (logData.cache_hit === false) {\n return {\n hit: false,\n cacheDisabled: logData.cache_disabled,\n height: undefined\n };\n }\n \n } catch (error) {\n // If JSON parsing fails, continue checking other logs\n // This is expected for non-JSON log entries\n continue;\n }\n }\n }\n \n // No cache metadata found\n return null;\n }\n \n /**\n * Validates cache metadata structure\n * @param metadata - The cache metadata to validate\n * @returns True if metadata is valid, false otherwise\n */\n static isValidCacheMetadata(metadata: any): metadata is CacheMetadata {\n if (!metadata || typeof metadata !== 'object') {\n return false;\n }\n \n // Check required fields\n if (typeof metadata.hit !== 'boolean') {\n return false;\n }\n \n // Check optional fields\n if (metadata.cacheDisabled !== undefined && typeof metadata.cacheDisabled !== 'boolean') {\n return false;\n }\n \n if (metadata.streamId !== undefined && typeof metadata.streamId !== 'string') {\n return false;\n }\n \n if (metadata.dataProvider !== undefined && typeof metadata.dataProvider !== 'string') {\n return false;\n }\n \n if (metadata.from !== undefined && typeof metadata.from !== 'number') {\n return false;\n }\n \n if (metadata.to !== undefined && typeof metadata.to !== 'number') {\n return false;\n }\n \n if (metadata.frozenAt !== undefined && typeof metadata.frozenAt !== 'number') {\n return false;\n }\n \n if (metadata.rowsServed !== undefined && typeof metadata.rowsServed !== 'number') {\n return false;\n }\n\n if (metadata.height !== undefined && typeof metadata.height !== 'number') {\n return false;\n }\n \n return true;\n }\n \n /**\n * Extracts cache metadata from Kwil response structure\n * @param response - The full response from Kwil client\n * @returns Cache metadata if found, null otherwise\n */\n static extractFromResponse(response: any): CacheMetadata | null {\n // Check if response has logs (new structure from kwil-js)\n if (response && response.data && response.data.logs) {\n return this.extractFromLogs(response.data.logs);\n }\n \n // Fallback: check if response has logs directly (for backward compatibility)\n if (response && response.logs) {\n return this.extractFromLogs(response.logs);\n }\n \n return null;\n }\n \n /**\n * Aggregates multiple cache metadata entries into a collection\n * @param metadataList - Array of cache metadata entries\n * @returns Aggregated cache metadata collection\n */\n static aggregate(metadataList: CacheMetadata[]): CacheMetadataCollection {\n const totalQueries = metadataList.length;\n let cacheHits = 0;\n let totalRowsServed = 0;\n \n for (const metadata of metadataList) {\n if (metadata.hit) {\n cacheHits++;\n }\n \n if (metadata.rowsServed) {\n totalRowsServed += metadata.rowsServed;\n }\n }\n \n const cacheMisses = totalQueries - cacheHits;\n const cacheHitRate = totalQueries > 0 ? cacheHits / totalQueries : 0;\n \n return {\n totalQueries,\n cacheHits,\n cacheMisses,\n cacheHitRate,\n totalRowsServed,\n entries: metadataList\n };\n }\n}"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+
3
+ // src/util/cacheMetadataParser.test.ts
4
+ var import_vitest = require("vitest");
5
+ var import_cacheMetadataParser = require("./cacheMetadataParser.cjs");
6
+ (0, import_vitest.describe)("CacheMetadataParser", () => {
7
+ (0, import_vitest.describe)("extractFromLogs", () => {
8
+ (0, import_vitest.it)("should extract cache hit metadata from valid log", () => {
9
+ const logs = ['{"cache_hit": true, "cache_height": 123456}'];
10
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
11
+ (0, import_vitest.expect)(result).toEqual({
12
+ hit: true,
13
+ cacheDisabled: void 0,
14
+ height: 123456
15
+ });
16
+ });
17
+ (0, import_vitest.it)("should extract enhanced cache metadata with cacheDisabled field", () => {
18
+ const logs = ['{"cache_hit": false, "cache_disabled": true}'];
19
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
20
+ (0, import_vitest.expect)(result).toEqual({
21
+ hit: false,
22
+ cacheDisabled: true,
23
+ height: void 0
24
+ });
25
+ });
26
+ (0, import_vitest.it)("should extract cache miss metadata from valid log", () => {
27
+ const logs = ['{"cache_hit": false}'];
28
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
29
+ (0, import_vitest.expect)(result).toEqual({
30
+ hit: false,
31
+ cacheDisabled: void 0,
32
+ height: void 0
33
+ });
34
+ });
35
+ (0, import_vitest.it)("should handle cache hit without height field", () => {
36
+ const logs = ['{"cache_hit": true}'];
37
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
38
+ (0, import_vitest.expect)(result).toEqual({
39
+ hit: true,
40
+ cacheDisabled: void 0,
41
+ height: void 0
42
+ });
43
+ });
44
+ (0, import_vitest.it)("should handle single string log with newlines", () => {
45
+ const log = 'other log entry\n{"cache_hit": true, "cache_height": 123456}\nmore logs';
46
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(log);
47
+ (0, import_vitest.expect)(result).toEqual({
48
+ hit: true,
49
+ cacheDisabled: void 0,
50
+ height: 123456
51
+ });
52
+ });
53
+ (0, import_vitest.it)("should handle array of logs", () => {
54
+ const logs = [
55
+ "normal log entry",
56
+ '{"cache_hit": true, "cache_height": 123456}',
57
+ "another log"
58
+ ];
59
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
60
+ (0, import_vitest.expect)(result).toEqual({
61
+ hit: true,
62
+ cacheDisabled: void 0,
63
+ height: 123456
64
+ });
65
+ });
66
+ (0, import_vitest.it)("should return null for logs without cache metadata", () => {
67
+ const logs = ["normal log entry", "another log"];
68
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
69
+ (0, import_vitest.expect)(result).toBeNull();
70
+ });
71
+ (0, import_vitest.it)("should return null for malformed JSON", () => {
72
+ const logs = ['{"cache_hit": true invalid json}'];
73
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
74
+ (0, import_vitest.expect)(result).toBeNull();
75
+ });
76
+ (0, import_vitest.it)("should return null for empty logs", () => {
77
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs([]);
78
+ (0, import_vitest.expect)(result).toBeNull();
79
+ });
80
+ (0, import_vitest.it)("should handle empty string logs", () => {
81
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(["", " ", "\n"]);
82
+ (0, import_vitest.expect)(result).toBeNull();
83
+ });
84
+ (0, import_vitest.it)("should extract cache hit metadata with all fields", () => {
85
+ const logs = ['{"cache_hit": true, "cache_height": 123456}'];
86
+ const metadata = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
87
+ (0, import_vitest.expect)(metadata).toEqual({
88
+ hit: true,
89
+ cacheDisabled: void 0,
90
+ height: 123456
91
+ });
92
+ });
93
+ (0, import_vitest.it)("should extract cache hit without optional fields", () => {
94
+ const logs = ['{"cache_hit": true}'];
95
+ const metadata = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
96
+ (0, import_vitest.expect)(metadata).toEqual({
97
+ hit: true,
98
+ cacheDisabled: void 0,
99
+ height: void 0
100
+ });
101
+ });
102
+ (0, import_vitest.it)("should extract cache miss", () => {
103
+ const logs = ['{"cache_hit": false}'];
104
+ const metadata = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
105
+ (0, import_vitest.expect)(metadata).toEqual({
106
+ hit: false,
107
+ cacheDisabled: void 0,
108
+ height: void 0
109
+ });
110
+ });
111
+ (0, import_vitest.it)("should handle logs with prepended numeric prefixes", () => {
112
+ const logs = ['1. {"cache_hit": true, "cache_height": 123456}\n2. some other log\n3. {"cache_hit": false}'];
113
+ const metadata = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
114
+ (0, import_vitest.expect)(metadata).toEqual({
115
+ hit: true,
116
+ cacheDisabled: void 0,
117
+ height: 123456
118
+ });
119
+ });
120
+ (0, import_vitest.it)("should handle array of logs with prepended numeric prefixes", () => {
121
+ const logs = [
122
+ "1. normal log line",
123
+ '2. {"cache_hit": false, "cache_disabled": true}',
124
+ "3. another log line"
125
+ ];
126
+ const metadata = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
127
+ (0, import_vitest.expect)(metadata).toEqual({
128
+ hit: false,
129
+ cacheDisabled: true,
130
+ height: void 0
131
+ });
132
+ });
133
+ (0, import_vitest.it)("should handle mixed format logs (some with prefixes, some without)", () => {
134
+ const logs = [
135
+ "normal log without prefix",
136
+ '1. {"cache_hit": true}',
137
+ "another log without prefix"
138
+ ];
139
+ const metadata = import_cacheMetadataParser.CacheMetadataParser.extractFromLogs(logs);
140
+ (0, import_vitest.expect)(metadata).toEqual({
141
+ hit: true,
142
+ cacheDisabled: void 0,
143
+ height: void 0
144
+ });
145
+ });
146
+ });
147
+ (0, import_vitest.describe)("isValidCacheMetadata", () => {
148
+ (0, import_vitest.it)("should validate correct cache metadata", () => {
149
+ const metadata = { hit: true, height: 123456 };
150
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);
151
+ });
152
+ (0, import_vitest.it)("should validate metadata without height", () => {
153
+ const metadata = { hit: false };
154
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);
155
+ });
156
+ (0, import_vitest.it)("should validate enhanced cache metadata with all fields", () => {
157
+ const metadata = {
158
+ hit: true,
159
+ cacheDisabled: false,
160
+ height: 123456,
161
+ streamId: "test-stream",
162
+ dataProvider: "0x123456789abcdef",
163
+ from: 1609459100,
164
+ to: 1609459300,
165
+ frozenAt: 1609459250,
166
+ rowsServed: 10
167
+ };
168
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);
169
+ });
170
+ (0, import_vitest.it)("should validate metadata with optional fields", () => {
171
+ const metadata = { hit: true, cacheDisabled: true };
172
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);
173
+ });
174
+ (0, import_vitest.it)("should reject metadata without hit field", () => {
175
+ const metadata = { height: 123456 };
176
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);
177
+ });
178
+ (0, import_vitest.it)("should reject metadata with invalid hit type", () => {
179
+ const metadata = { hit: "true", height: 123456 };
180
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);
181
+ });
182
+ (0, import_vitest.it)("should reject metadata with invalid cacheDisabled type", () => {
183
+ const metadata = { hit: true, cacheDisabled: "false" };
184
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);
185
+ });
186
+ (0, import_vitest.it)("should reject metadata with invalid streamId type", () => {
187
+ const metadata = { hit: true, streamId: 123 };
188
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);
189
+ });
190
+ (0, import_vitest.it)("should reject metadata with invalid dataProvider type", () => {
191
+ const metadata = { hit: true, dataProvider: 456 };
192
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);
193
+ });
194
+ (0, import_vitest.it)("should reject metadata with invalid numeric fields", () => {
195
+ const invalidFromMetadata = { hit: true, from: "123" };
196
+ const invalidToMetadata = { hit: true, to: "456" };
197
+ const invalidFrozenAtMetadata = { hit: true, frozenAt: "789" };
198
+ const invalidRowsServedMetadata = { hit: true, rowsServed: "10" };
199
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(invalidFromMetadata)).toBe(false);
200
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(invalidToMetadata)).toBe(false);
201
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(invalidFrozenAtMetadata)).toBe(false);
202
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(invalidRowsServedMetadata)).toBe(false);
203
+ });
204
+ (0, import_vitest.it)("should validate complete metadata", () => {
205
+ const metadata = { hit: true, height: 123456 };
206
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);
207
+ });
208
+ (0, import_vitest.it)("should reject metadata with invalid height type", () => {
209
+ const metadata = { hit: true, height: "123456" };
210
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);
211
+ });
212
+ (0, import_vitest.it)("should reject null or undefined", () => {
213
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(null)).toBe(false);
214
+ (0, import_vitest.expect)(import_cacheMetadataParser.CacheMetadataParser.isValidCacheMetadata(void 0)).toBe(false);
215
+ });
216
+ });
217
+ (0, import_vitest.describe)("extractFromResponse", () => {
218
+ (0, import_vitest.it)("should extract from response with logs", () => {
219
+ const response = {
220
+ data: { result: [] },
221
+ logs: ['{"cache_hit": true, "cache_height": 123456}']
222
+ };
223
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromResponse(response);
224
+ (0, import_vitest.expect)(result).toEqual({
225
+ hit: true,
226
+ cacheDisabled: void 0,
227
+ height: 123456
228
+ });
229
+ });
230
+ (0, import_vitest.it)("should return null for response without logs", () => {
231
+ const response = { data: { result: [] } };
232
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromResponse(response);
233
+ (0, import_vitest.expect)(result).toBeNull();
234
+ });
235
+ (0, import_vitest.it)("should return null for null response", () => {
236
+ const result = import_cacheMetadataParser.CacheMetadataParser.extractFromResponse(null);
237
+ (0, import_vitest.expect)(result).toBeNull();
238
+ });
239
+ });
240
+ (0, import_vitest.describe)("aggregate", () => {
241
+ (0, import_vitest.it)("should aggregate empty metadata list", () => {
242
+ const result = import_cacheMetadataParser.CacheMetadataParser.aggregate([]);
243
+ (0, import_vitest.expect)(result).toEqual({
244
+ totalQueries: 0,
245
+ cacheHits: 0,
246
+ cacheMisses: 0,
247
+ cacheHitRate: 0,
248
+ totalRowsServed: 0,
249
+ entries: []
250
+ });
251
+ });
252
+ (0, import_vitest.it)("should aggregate single metadata entry", () => {
253
+ const metadata = {
254
+ hit: true,
255
+ height: 123456,
256
+ streamId: "test-stream",
257
+ rowsServed: 5
258
+ };
259
+ const result = import_cacheMetadataParser.CacheMetadataParser.aggregate([metadata]);
260
+ (0, import_vitest.expect)(result).toEqual({
261
+ totalQueries: 1,
262
+ cacheHits: 1,
263
+ cacheMisses: 0,
264
+ cacheHitRate: 1,
265
+ totalRowsServed: 5,
266
+ entries: [metadata]
267
+ });
268
+ });
269
+ (0, import_vitest.it)("should aggregate multiple metadata entries", () => {
270
+ const metadata1 = {
271
+ hit: true,
272
+ height: 123456,
273
+ streamId: "stream-1",
274
+ rowsServed: 10
275
+ };
276
+ const metadata2 = {
277
+ hit: false,
278
+ streamId: "stream-2",
279
+ rowsServed: 5
280
+ };
281
+ const metadata3 = {
282
+ hit: true,
283
+ height: 123457,
284
+ streamId: "stream-3",
285
+ rowsServed: 15
286
+ };
287
+ const result = import_cacheMetadataParser.CacheMetadataParser.aggregate([metadata1, metadata2, metadata3]);
288
+ (0, import_vitest.expect)(result).toEqual({
289
+ totalQueries: 3,
290
+ cacheHits: 2,
291
+ cacheMisses: 1,
292
+ cacheHitRate: 2 / 3,
293
+ totalRowsServed: 30,
294
+ entries: [metadata1, metadata2, metadata3]
295
+ });
296
+ });
297
+ (0, import_vitest.it)("should handle metadata without rowsServed", () => {
298
+ const metadata1 = { hit: true, height: 123456 };
299
+ const metadata2 = { hit: false };
300
+ const metadata3 = { hit: true, rowsServed: 8 };
301
+ const result = import_cacheMetadataParser.CacheMetadataParser.aggregate([metadata1, metadata2, metadata3]);
302
+ (0, import_vitest.expect)(result).toEqual({
303
+ totalQueries: 3,
304
+ cacheHits: 2,
305
+ cacheMisses: 1,
306
+ cacheHitRate: 2 / 3,
307
+ totalRowsServed: 8,
308
+ // Only metadata3 has rowsServed
309
+ entries: [metadata1, metadata2, metadata3]
310
+ });
311
+ });
312
+ (0, import_vitest.it)("should calculate correct cache hit rate for mixed results", () => {
313
+ const metadataList = [
314
+ { hit: true, rowsServed: 1 },
315
+ { hit: false, rowsServed: 2 },
316
+ { hit: false, rowsServed: 3 },
317
+ { hit: true, rowsServed: 4 },
318
+ { hit: true, rowsServed: 5 }
319
+ ];
320
+ const result = import_cacheMetadataParser.CacheMetadataParser.aggregate(metadataList);
321
+ (0, import_vitest.expect)(result.totalQueries).toBe(5);
322
+ (0, import_vitest.expect)(result.cacheHits).toBe(3);
323
+ (0, import_vitest.expect)(result.cacheMisses).toBe(2);
324
+ (0, import_vitest.expect)(result.cacheHitRate).toBe(0.6);
325
+ (0, import_vitest.expect)(result.totalRowsServed).toBe(15);
326
+ });
327
+ });
328
+ });
329
+ //# sourceMappingURL=cacheMetadataParser.test.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/cacheMetadataParser.test.ts"],
4
+ "sourcesContent": ["import { describe, it, expect } from 'vitest';\nimport { CacheMetadataParser } from './cacheMetadataParser';\nimport type { CacheMetadata } from '../types/cache';\n\ndescribe('CacheMetadataParser', () => {\n describe('extractFromLogs', () => {\n it('should extract cache hit metadata from valid log', () => {\n const logs = ['{\"cache_hit\": true, \"cache_height\": 123456}'];\n const result = CacheMetadataParser.extractFromLogs(logs);\n \n expect(result).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: 123456\n });\n });\n\n it('should extract enhanced cache metadata with cacheDisabled field', () => {\n const logs = ['{\"cache_hit\": false, \"cache_disabled\": true}'];\n const result = CacheMetadataParser.extractFromLogs(logs);\n \n expect(result).toEqual({\n hit: false,\n cacheDisabled: true,\n height: undefined\n });\n });\n\n it('should extract cache miss metadata from valid log', () => {\n const logs = ['{\"cache_hit\": false}'];\n const result = CacheMetadataParser.extractFromLogs(logs);\n \n expect(result).toEqual({\n hit: false,\n cacheDisabled: undefined,\n height: undefined\n });\n });\n\n it('should handle cache hit without height field', () => {\n const logs = ['{\"cache_hit\": true}'];\n const result = CacheMetadataParser.extractFromLogs(logs);\n \n expect(result).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: undefined\n });\n });\n\n it('should handle single string log with newlines', () => {\n const log = 'other log entry\\n{\"cache_hit\": true, \"cache_height\": 123456}\\nmore logs';\n const result = CacheMetadataParser.extractFromLogs(log);\n \n expect(result).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: 123456\n });\n });\n\n it('should handle array of logs', () => {\n const logs = [\n 'normal log entry',\n '{\"cache_hit\": true, \"cache_height\": 123456}',\n 'another log'\n ];\n const result = CacheMetadataParser.extractFromLogs(logs);\n \n expect(result).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: 123456\n });\n });\n\n it('should return null for logs without cache metadata', () => {\n const logs = ['normal log entry', 'another log'];\n const result = CacheMetadataParser.extractFromLogs(logs);\n \n expect(result).toBeNull();\n });\n\n it('should return null for malformed JSON', () => {\n const logs = ['{\"cache_hit\": true invalid json}'];\n const result = CacheMetadataParser.extractFromLogs(logs);\n \n expect(result).toBeNull();\n });\n\n it('should return null for empty logs', () => {\n const result = CacheMetadataParser.extractFromLogs([]);\n expect(result).toBeNull();\n });\n\n it('should handle empty string logs', () => {\n const result = CacheMetadataParser.extractFromLogs(['', ' ', '\\n']);\n expect(result).toBeNull();\n });\n\n it('should extract cache hit metadata with all fields', () => {\n const logs = ['{\"cache_hit\": true, \"cache_height\": 123456}'];\n const metadata = CacheMetadataParser.extractFromLogs(logs);\n expect(metadata).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: 123456\n });\n });\n\n it('should extract cache hit without optional fields', () => {\n const logs = ['{\"cache_hit\": true}'];\n const metadata = CacheMetadataParser.extractFromLogs(logs);\n expect(metadata).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: undefined\n });\n });\n\n it('should extract cache miss', () => {\n const logs = ['{\"cache_hit\": false}'];\n const metadata = CacheMetadataParser.extractFromLogs(logs);\n expect(metadata).toEqual({\n hit: false,\n cacheDisabled: undefined,\n height: undefined\n });\n });\n\n it('should handle logs with prepended numeric prefixes', () => {\n const logs = ['1. {\"cache_hit\": true, \"cache_height\": 123456}\\n2. some other log\\n3. {\"cache_hit\": false}'];\n const metadata = CacheMetadataParser.extractFromLogs(logs);\n // Should extract the first cache metadata found (cache hit)\n expect(metadata).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: 123456\n });\n });\n\n it('should handle array of logs with prepended numeric prefixes', () => {\n const logs = [\n '1. normal log line',\n '2. {\"cache_hit\": false, \"cache_disabled\": true}',\n '3. another log line'\n ];\n const metadata = CacheMetadataParser.extractFromLogs(logs);\n expect(metadata).toEqual({\n hit: false,\n cacheDisabled: true,\n height: undefined\n });\n });\n\n it('should handle mixed format logs (some with prefixes, some without)', () => {\n const logs = [\n 'normal log without prefix',\n '1. {\"cache_hit\": true}',\n 'another log without prefix'\n ];\n const metadata = CacheMetadataParser.extractFromLogs(logs);\n expect(metadata).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: undefined\n });\n });\n });\n\n describe('isValidCacheMetadata', () => {\n it('should validate correct cache metadata', () => {\n const metadata = { hit: true, height: 123456 };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);\n });\n\n it('should validate metadata without height', () => {\n const metadata = { hit: false };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);\n });\n\n it('should validate enhanced cache metadata with all fields', () => {\n const metadata: CacheMetadata = {\n hit: true,\n cacheDisabled: false,\n height: 123456,\n streamId: 'test-stream',\n dataProvider: '0x123456789abcdef',\n from: 1609459100,\n to: 1609459300,\n frozenAt: 1609459250,\n rowsServed: 10\n };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);\n });\n\n it('should validate metadata with optional fields', () => {\n const metadata = { hit: true, cacheDisabled: true };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);\n });\n\n it('should reject metadata without hit field', () => {\n const metadata = { height: 123456 };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);\n });\n\n it('should reject metadata with invalid hit type', () => {\n const metadata = { hit: 'true', height: 123456 };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);\n });\n\n it('should reject metadata with invalid cacheDisabled type', () => {\n const metadata = { hit: true, cacheDisabled: 'false' };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);\n });\n\n it('should reject metadata with invalid streamId type', () => {\n const metadata = { hit: true, streamId: 123 };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);\n });\n\n it('should reject metadata with invalid dataProvider type', () => {\n const metadata = { hit: true, dataProvider: 456 };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);\n });\n\n it('should reject metadata with invalid numeric fields', () => {\n const invalidFromMetadata = { hit: true, from: '123' };\n const invalidToMetadata = { hit: true, to: '456' };\n const invalidFrozenAtMetadata = { hit: true, frozenAt: '789' };\n const invalidRowsServedMetadata = { hit: true, rowsServed: '10' };\n\n expect(CacheMetadataParser.isValidCacheMetadata(invalidFromMetadata)).toBe(false);\n expect(CacheMetadataParser.isValidCacheMetadata(invalidToMetadata)).toBe(false);\n expect(CacheMetadataParser.isValidCacheMetadata(invalidFrozenAtMetadata)).toBe(false);\n expect(CacheMetadataParser.isValidCacheMetadata(invalidRowsServedMetadata)).toBe(false);\n });\n\n it('should validate complete metadata', () => {\n const metadata = { hit: true, height: 123456 };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(true);\n });\n\n it('should reject metadata with invalid height type', () => {\n const metadata = { hit: true, height: '123456' };\n expect(CacheMetadataParser.isValidCacheMetadata(metadata)).toBe(false);\n });\n\n it('should reject null or undefined', () => {\n expect(CacheMetadataParser.isValidCacheMetadata(null)).toBe(false);\n expect(CacheMetadataParser.isValidCacheMetadata(undefined)).toBe(false);\n });\n });\n\n describe('extractFromResponse', () => {\n it('should extract from response with logs', () => {\n const response = {\n data: { result: [] },\n logs: ['{\"cache_hit\": true, \"cache_height\": 123456}']\n };\n const result = CacheMetadataParser.extractFromResponse(response);\n \n expect(result).toEqual({\n hit: true,\n cacheDisabled: undefined,\n height: 123456\n });\n });\n\n it('should return null for response without logs', () => {\n const response = { data: { result: [] } };\n const result = CacheMetadataParser.extractFromResponse(response);\n \n expect(result).toBeNull();\n });\n\n it('should return null for null response', () => {\n const result = CacheMetadataParser.extractFromResponse(null);\n expect(result).toBeNull();\n });\n });\n\n describe('aggregate', () => {\n it('should aggregate empty metadata list', () => {\n const result = CacheMetadataParser.aggregate([]);\n \n expect(result).toEqual({\n totalQueries: 0,\n cacheHits: 0,\n cacheMisses: 0,\n cacheHitRate: 0,\n totalRowsServed: 0,\n entries: []\n });\n });\n\n it('should aggregate single metadata entry', () => {\n const metadata: CacheMetadata = {\n hit: true,\n height: 123456,\n streamId: 'test-stream',\n rowsServed: 5\n };\n \n const result = CacheMetadataParser.aggregate([metadata]);\n \n expect(result).toEqual({\n totalQueries: 1,\n cacheHits: 1,\n cacheMisses: 0,\n cacheHitRate: 1.0,\n totalRowsServed: 5,\n entries: [metadata]\n });\n });\n\n it('should aggregate multiple metadata entries', () => {\n const metadata1: CacheMetadata = {\n hit: true,\n height: 123456,\n streamId: 'stream-1',\n rowsServed: 10\n };\n \n const metadata2: CacheMetadata = {\n hit: false,\n streamId: 'stream-2',\n rowsServed: 5\n };\n \n const metadata3: CacheMetadata = {\n hit: true,\n height: 123457,\n streamId: 'stream-3',\n rowsServed: 15\n };\n \n const result = CacheMetadataParser.aggregate([metadata1, metadata2, metadata3]);\n \n expect(result).toEqual({\n totalQueries: 3,\n cacheHits: 2,\n cacheMisses: 1,\n cacheHitRate: 2/3,\n totalRowsServed: 30,\n entries: [metadata1, metadata2, metadata3]\n });\n });\n\n it('should handle metadata without rowsServed', () => {\n const metadata1: CacheMetadata = { hit: true, height: 123456 };\n const metadata2: CacheMetadata = { hit: false };\n const metadata3: CacheMetadata = { hit: true, rowsServed: 8 };\n \n const result = CacheMetadataParser.aggregate([metadata1, metadata2, metadata3]);\n \n expect(result).toEqual({\n totalQueries: 3,\n cacheHits: 2,\n cacheMisses: 1,\n cacheHitRate: 2/3,\n totalRowsServed: 8, // Only metadata3 has rowsServed\n entries: [metadata1, metadata2, metadata3]\n });\n });\n\n it('should calculate correct cache hit rate for mixed results', () => {\n const metadataList: CacheMetadata[] = [\n { hit: true, rowsServed: 1 },\n { hit: false, rowsServed: 2 },\n { hit: false, rowsServed: 3 },\n { hit: true, rowsServed: 4 },\n { hit: true, rowsServed: 5 }\n ];\n \n const result = CacheMetadataParser.aggregate(metadataList);\n \n expect(result.totalQueries).toBe(5);\n expect(result.cacheHits).toBe(3);\n expect(result.cacheMisses).toBe(2);\n expect(result.cacheHitRate).toBe(0.6); // 3/5 = 0.6\n expect(result.totalRowsServed).toBe(15); // 1+2+3+4+5 = 15\n });\n });\n});"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/util/cacheValidation.ts
21
+ var cacheValidation_exports = {};
22
+ __export(cacheValidation_exports, {
23
+ CacheValidation: () => CacheValidation
24
+ });
25
+ module.exports = __toCommonJS(cacheValidation_exports);
26
+ var CacheValidation = class {
27
+ /**
28
+ * Validates GetRecordOptions parameters
29
+ */
30
+ static validateGetRecordOptions(options) {
31
+ if (options.from !== void 0 && (typeof options.from !== "number" || options.from < 0)) {
32
+ throw new Error("Invalid from parameter: must be a non-negative number");
33
+ }
34
+ if (options.to !== void 0 && (typeof options.to !== "number" || options.to < 0)) {
35
+ throw new Error("Invalid to parameter: must be a non-negative number");
36
+ }
37
+ if (options.frozenAt !== void 0 && (typeof options.frozenAt !== "number" || options.frozenAt < 0)) {
38
+ throw new Error("Invalid frozenAt parameter: must be a non-negative number");
39
+ }
40
+ if (options.useCache !== void 0 && typeof options.useCache !== "boolean") {
41
+ throw new Error("Invalid useCache parameter: must be a boolean");
42
+ }
43
+ if (options.prefix !== void 0 && typeof options.prefix !== "string") {
44
+ throw new Error("Invalid prefix parameter: must be a string");
45
+ }
46
+ if (options.baseTime !== void 0 && typeof options.baseTime !== "number" && typeof options.baseTime !== "string") {
47
+ throw new Error("Invalid baseTime parameter: must be a number or string");
48
+ }
49
+ }
50
+ /**
51
+ * Validates GetIndexOptions parameters
52
+ */
53
+ static validateGetIndexOptions(options) {
54
+ this.validateGetRecordOptions(options);
55
+ }
56
+ /**
57
+ * Validates GetIndexChangeOptions parameters
58
+ */
59
+ static validateGetIndexChangeOptions(options) {
60
+ this.validateGetRecordOptions(options);
61
+ if (typeof options.timeInterval !== "number" || options.timeInterval <= 0) {
62
+ throw new Error("Invalid timeInterval parameter: must be a positive number");
63
+ }
64
+ }
65
+ /**
66
+ * Validates GetFirstRecordOptions parameters
67
+ */
68
+ static validateGetFirstRecordOptions(options) {
69
+ if (options.after !== void 0 && (typeof options.after !== "number" || options.after < 0)) {
70
+ throw new Error("Invalid after parameter: must be a non-negative number");
71
+ }
72
+ if (options.frozenAt !== void 0 && (typeof options.frozenAt !== "number" || options.frozenAt < 0)) {
73
+ throw new Error("Invalid frozenAt parameter: must be a non-negative number");
74
+ }
75
+ if (options.useCache !== void 0 && typeof options.useCache !== "boolean") {
76
+ throw new Error("Invalid useCache parameter: must be a boolean");
77
+ }
78
+ }
79
+ /**
80
+ * Validates time range parameters
81
+ */
82
+ static validateTimeRange(from, to) {
83
+ if (from !== void 0 && to !== void 0 && from > to) {
84
+ throw new Error("Invalid time range: from time cannot be greater than to time");
85
+ }
86
+ }
87
+ };
88
+ //# sourceMappingURL=cacheValidation.cjs.map