@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.
- package/dist/cjs/client/client.cjs +44 -0
- package/dist/cjs/client/client.cjs.map +2 -2
- package/dist/cjs/contracts-api/action.cjs +301 -77
- package/dist/cjs/contracts-api/action.cjs.map +3 -3
- package/dist/cjs/contracts-api/cache.integration.test.cjs +265 -0
- package/dist/cjs/contracts-api/cache.integration.test.cjs.map +7 -0
- package/dist/cjs/contracts-api/composedAction.cjs +86 -0
- package/dist/cjs/contracts-api/composedAction.cjs.map +2 -2
- package/dist/cjs/contracts-api/composedAction.test.cjs +301 -0
- package/dist/cjs/contracts-api/composedAction.test.cjs.map +7 -0
- package/dist/cjs/index.common.cjs.map +1 -1
- package/dist/cjs/types/cache.cjs +34 -0
- package/dist/cjs/types/cache.cjs.map +7 -0
- package/dist/cjs/types/cache.test.cjs +205 -0
- package/dist/cjs/types/cache.test.cjs.map +7 -0
- package/dist/cjs/util/cacheMetadataParser.cjs +174 -0
- package/dist/cjs/util/cacheMetadataParser.cjs.map +7 -0
- package/dist/cjs/util/cacheMetadataParser.test.cjs +329 -0
- package/dist/cjs/util/cacheMetadataParser.test.cjs.map +7 -0
- package/dist/cjs/util/cacheValidation.cjs +88 -0
- package/dist/cjs/util/cacheValidation.cjs.map +7 -0
- package/dist/cjs/util/cacheValidation.test.cjs +108 -0
- package/dist/cjs/util/cacheValidation.test.cjs.map +7 -0
- package/dist/esm/client/client.mjs +44 -0
- package/dist/esm/client/client.mjs.map +2 -2
- package/dist/esm/contracts-api/action.mjs +302 -77
- package/dist/esm/contracts-api/action.mjs.map +3 -3
- package/dist/esm/contracts-api/cache.integration.test.mjs +263 -0
- package/dist/esm/contracts-api/cache.integration.test.mjs.map +7 -0
- package/dist/esm/contracts-api/composedAction.mjs +86 -0
- package/dist/esm/contracts-api/composedAction.mjs.map +2 -2
- package/dist/esm/contracts-api/composedAction.test.mjs +299 -0
- package/dist/esm/contracts-api/composedAction.test.mjs.map +7 -0
- package/dist/esm/index.common.mjs.map +1 -1
- package/dist/esm/types/cache.mjs +13 -0
- package/dist/esm/types/cache.mjs.map +7 -0
- package/dist/esm/types/cache.test.mjs +203 -0
- package/dist/esm/types/cache.test.mjs.map +7 -0
- package/dist/esm/util/cacheMetadataParser.mjs +153 -0
- package/dist/esm/util/cacheMetadataParser.mjs.map +7 -0
- package/dist/esm/util/cacheMetadataParser.test.mjs +327 -0
- package/dist/esm/util/cacheMetadataParser.test.mjs.map +7 -0
- package/dist/esm/util/cacheValidation.mjs +67 -0
- package/dist/esm/util/cacheValidation.mjs.map +7 -0
- package/dist/esm/util/cacheValidation.test.mjs +106 -0
- package/dist/esm/util/cacheValidation.test.mjs.map +7 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/client/client.d.ts +39 -1
- package/dist/types/client/client.d.ts.map +1 -1
- package/dist/types/contracts-api/action.d.ts +11 -1
- package/dist/types/contracts-api/action.d.ts.map +1 -1
- package/dist/types/contracts-api/cache.integration.test.d.ts +2 -0
- package/dist/types/contracts-api/cache.integration.test.d.ts.map +1 -0
- package/dist/types/contracts-api/composedAction.d.ts +75 -0
- package/dist/types/contracts-api/composedAction.d.ts.map +1 -1
- package/dist/types/contracts-api/composedAction.test.d.ts +2 -0
- package/dist/types/contracts-api/composedAction.test.d.ts.map +1 -0
- package/dist/types/index.common.d.ts +1 -1
- package/dist/types/index.common.d.ts.map +1 -1
- package/dist/types/types/cache.d.ts +129 -0
- package/dist/types/types/cache.d.ts.map +1 -0
- package/dist/types/types/cache.test.d.ts +2 -0
- package/dist/types/types/cache.test.d.ts.map +1 -0
- package/dist/types/util/cacheMetadataParser.d.ts +38 -0
- package/dist/types/util/cacheMetadataParser.d.ts.map +1 -0
- package/dist/types/util/cacheMetadataParser.test.d.ts +2 -0
- package/dist/types/util/cacheMetadataParser.test.d.ts.map +1 -0
- package/dist/types/util/cacheValidation.d.ts +27 -0
- package/dist/types/util/cacheValidation.d.ts.map +1 -0
- package/dist/types/util/cacheValidation.test.d.ts +2 -0
- package/dist/types/util/cacheValidation.test.d.ts.map +1 -0
- package/package.json +5 -3
- package/dist/cjs/client/client.test.cjs +0 -32
- package/dist/cjs/client/client.test.cjs.map +0 -7
- package/dist/esm/client/client.test.mjs +0 -30
- package/dist/esm/client/client.test.mjs.map +0 -7
- package/dist/types/client/client.test.d.ts +0 -2
- package/dist/types/client/client.test.d.ts.map +0 -1
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
// src/contracts-api/cache.integration.test.ts
|
|
2
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
3
|
+
import { Action } from "./action.mjs";
|
|
4
|
+
import { EthereumAddress } from "../util/EthereumAddress.mjs";
|
|
5
|
+
import { StreamId } from "../util/StreamId.mjs";
|
|
6
|
+
var mockKwilClient = {
|
|
7
|
+
call: vi.fn(),
|
|
8
|
+
execute: vi.fn()
|
|
9
|
+
};
|
|
10
|
+
var mockKwilSigner = {};
|
|
11
|
+
describe("Cache Integration Tests", () => {
|
|
12
|
+
let action;
|
|
13
|
+
let streamLocator;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
action = new Action(mockKwilClient, mockKwilSigner);
|
|
16
|
+
streamLocator = {
|
|
17
|
+
streamId: StreamId.fromString("test-stream").unwrap(),
|
|
18
|
+
dataProvider: new EthereumAddress("0x1234567890123456789012345678901234567890")
|
|
19
|
+
};
|
|
20
|
+
vi.clearAllMocks();
|
|
21
|
+
});
|
|
22
|
+
describe("getRecord cache functionality", () => {
|
|
23
|
+
it("should handle cache-aware getRecord call", async () => {
|
|
24
|
+
const mockResponse = {
|
|
25
|
+
status: 200,
|
|
26
|
+
data: {
|
|
27
|
+
result: [
|
|
28
|
+
{ event_time: 1609459200, value: "100" },
|
|
29
|
+
{ event_time: 1609459260, value: "101" }
|
|
30
|
+
],
|
|
31
|
+
logs: "1. cache_hit: true\n2. other log\n111. cache_miss: false"
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
mockKwilClient.call.mockResolvedValue(mockResponse);
|
|
35
|
+
const result = await action.getRecord(streamLocator, {
|
|
36
|
+
from: 1609459200,
|
|
37
|
+
to: 1609459300,
|
|
38
|
+
useCache: true
|
|
39
|
+
});
|
|
40
|
+
expect(mockKwilClient.call).toHaveBeenCalledWith(
|
|
41
|
+
{
|
|
42
|
+
namespace: "main",
|
|
43
|
+
name: "get_record",
|
|
44
|
+
inputs: {
|
|
45
|
+
$data_provider: "0x1234567890123456789012345678901234567890",
|
|
46
|
+
$stream_id: "test-stream",
|
|
47
|
+
$from: 1609459200,
|
|
48
|
+
$to: 1609459300,
|
|
49
|
+
$frozen_at: void 0,
|
|
50
|
+
$use_cache: true
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
mockKwilSigner
|
|
54
|
+
);
|
|
55
|
+
expect(result).toEqual({
|
|
56
|
+
data: [
|
|
57
|
+
{ eventTime: 1609459200, value: "100" },
|
|
58
|
+
{ eventTime: 1609459260, value: "101" }
|
|
59
|
+
],
|
|
60
|
+
cache: void 0,
|
|
61
|
+
logs: ["cache_hit: true", "other log", "cache_miss: false"]
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
it("should handle cache-aware getRecord call with cache metadata", async () => {
|
|
65
|
+
const mockResponse = {
|
|
66
|
+
status: 200,
|
|
67
|
+
data: {
|
|
68
|
+
result: [
|
|
69
|
+
{ event_time: 1609459200, value: "100" }
|
|
70
|
+
],
|
|
71
|
+
logs: '1. {"cache_hit":true,"cache_disabled":false,"cache_height":148670}'
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
mockKwilClient.call.mockResolvedValue(mockResponse);
|
|
75
|
+
const result = await action.getRecord(streamLocator, {
|
|
76
|
+
useCache: true
|
|
77
|
+
});
|
|
78
|
+
expect(result).toHaveProperty("data");
|
|
79
|
+
expect(result).toHaveProperty("cache");
|
|
80
|
+
expect(result).toHaveProperty("logs");
|
|
81
|
+
expect(result.data).toEqual([
|
|
82
|
+
{ eventTime: 1609459200, value: "100" }
|
|
83
|
+
]);
|
|
84
|
+
expect(result.cache).toMatchObject({
|
|
85
|
+
hit: true,
|
|
86
|
+
cacheDisabled: false,
|
|
87
|
+
height: 148670,
|
|
88
|
+
dataProvider: "0x1234567890123456789012345678901234567890",
|
|
89
|
+
from: void 0,
|
|
90
|
+
frozenAt: void 0,
|
|
91
|
+
rowsServed: 1,
|
|
92
|
+
streamId: "test-stream",
|
|
93
|
+
to: void 0
|
|
94
|
+
});
|
|
95
|
+
expect(result.logs).toMatchObject(['{"cache_hit":true,"cache_disabled":false,"cache_height":148670}']);
|
|
96
|
+
});
|
|
97
|
+
it("should omit useCache parameter when not provided", async () => {
|
|
98
|
+
const mockResponse = {
|
|
99
|
+
status: 200,
|
|
100
|
+
data: { result: [] }
|
|
101
|
+
};
|
|
102
|
+
mockKwilClient.call.mockResolvedValue(mockResponse);
|
|
103
|
+
await action.getRecord(streamLocator, {
|
|
104
|
+
from: 1609459200
|
|
105
|
+
});
|
|
106
|
+
expect(mockKwilClient.call).toHaveBeenCalledWith(
|
|
107
|
+
{
|
|
108
|
+
namespace: "main",
|
|
109
|
+
name: "get_record",
|
|
110
|
+
inputs: {
|
|
111
|
+
$data_provider: "0x1234567890123456789012345678901234567890",
|
|
112
|
+
$stream_id: "test-stream",
|
|
113
|
+
$from: 1609459200,
|
|
114
|
+
$to: void 0,
|
|
115
|
+
$frozen_at: void 0
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
mockKwilSigner
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
it("should handle error responses", async () => {
|
|
122
|
+
mockKwilClient.call.mockResolvedValue({
|
|
123
|
+
status: 500,
|
|
124
|
+
data: null
|
|
125
|
+
});
|
|
126
|
+
await expect(action.getRecord(streamLocator, { useCache: true })).rejects.toThrow("Failed to get record: 500");
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe("getIndex cache functionality", () => {
|
|
130
|
+
it("should handle cache-aware getIndex call", async () => {
|
|
131
|
+
const mockResponse = {
|
|
132
|
+
status: 200,
|
|
133
|
+
data: {
|
|
134
|
+
result: [
|
|
135
|
+
{ event_time: 1609459200, value: "100" }
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
mockKwilClient.call.mockResolvedValue(mockResponse);
|
|
140
|
+
const result = await action.getIndex(streamLocator, {
|
|
141
|
+
from: 1609459200,
|
|
142
|
+
to: 1609459300,
|
|
143
|
+
baseTime: 1609459180,
|
|
144
|
+
useCache: true
|
|
145
|
+
});
|
|
146
|
+
expect(mockKwilClient.call).toHaveBeenCalledWith(
|
|
147
|
+
{
|
|
148
|
+
namespace: "main",
|
|
149
|
+
name: "get_index",
|
|
150
|
+
inputs: {
|
|
151
|
+
$data_provider: "0x1234567890123456789012345678901234567890",
|
|
152
|
+
$stream_id: "test-stream",
|
|
153
|
+
$from: 1609459200,
|
|
154
|
+
$to: 1609459300,
|
|
155
|
+
$frozen_at: void 0,
|
|
156
|
+
$base_time: 1609459180,
|
|
157
|
+
$use_cache: true
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
mockKwilSigner
|
|
161
|
+
);
|
|
162
|
+
expect(result.data).toEqual([
|
|
163
|
+
{ eventTime: 1609459200, value: "100" }
|
|
164
|
+
]);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe("getFirstRecord cache functionality", () => {
|
|
168
|
+
it("should handle cache-aware getFirstRecord call", async () => {
|
|
169
|
+
const mockResponse = {
|
|
170
|
+
status: 200,
|
|
171
|
+
data: {
|
|
172
|
+
result: [
|
|
173
|
+
{ event_time: 1609459200, value: "100" }
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
mockKwilClient.call.mockResolvedValue(mockResponse);
|
|
178
|
+
const result = await action.getFirstRecord(streamLocator, {
|
|
179
|
+
after: 1609459180,
|
|
180
|
+
useCache: true
|
|
181
|
+
});
|
|
182
|
+
expect(mockKwilClient.call).toHaveBeenCalledWith(
|
|
183
|
+
{
|
|
184
|
+
namespace: "main",
|
|
185
|
+
name: "get_first_record",
|
|
186
|
+
inputs: {
|
|
187
|
+
$data_provider: "0x1234567890123456789012345678901234567890",
|
|
188
|
+
$stream_id: "test-stream",
|
|
189
|
+
$after: 1609459180,
|
|
190
|
+
$frozen_at: void 0,
|
|
191
|
+
$use_cache: true
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
mockKwilSigner
|
|
195
|
+
);
|
|
196
|
+
expect(result.data).toEqual({
|
|
197
|
+
eventTime: 1609459200,
|
|
198
|
+
value: "100"
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
it("should handle empty result for getFirstRecord", async () => {
|
|
202
|
+
const mockResponse = {
|
|
203
|
+
status: 200,
|
|
204
|
+
data: { result: [] }
|
|
205
|
+
};
|
|
206
|
+
mockKwilClient.call.mockResolvedValue(mockResponse);
|
|
207
|
+
const result = await action.getFirstRecord(streamLocator, {
|
|
208
|
+
useCache: true
|
|
209
|
+
});
|
|
210
|
+
expect(result.data).toBeNull();
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe("getIndexChange cache functionality", () => {
|
|
214
|
+
it("should handle cache-aware getIndexChange call", async () => {
|
|
215
|
+
const mockResponse = {
|
|
216
|
+
status: 200,
|
|
217
|
+
data: {
|
|
218
|
+
result: [
|
|
219
|
+
{ event_time: 1609459200, value: "5.2" }
|
|
220
|
+
]
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
mockKwilClient.call.mockResolvedValue(mockResponse);
|
|
224
|
+
const result = await action.getIndexChange(streamLocator, {
|
|
225
|
+
from: 1609459200,
|
|
226
|
+
to: 1609459300,
|
|
227
|
+
timeInterval: 60,
|
|
228
|
+
useCache: true
|
|
229
|
+
});
|
|
230
|
+
expect(mockKwilClient.call).toHaveBeenCalledWith(
|
|
231
|
+
{
|
|
232
|
+
namespace: "main",
|
|
233
|
+
name: "get_index_change",
|
|
234
|
+
inputs: {
|
|
235
|
+
$data_provider: "0x1234567890123456789012345678901234567890",
|
|
236
|
+
$stream_id: "test-stream",
|
|
237
|
+
$from: 1609459200,
|
|
238
|
+
$to: 1609459300,
|
|
239
|
+
$frozen_at: void 0,
|
|
240
|
+
$base_time: void 0,
|
|
241
|
+
$time_interval: 60,
|
|
242
|
+
$use_cache: true
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
mockKwilSigner
|
|
246
|
+
);
|
|
247
|
+
expect(result.data).toEqual([
|
|
248
|
+
{ eventTime: 1609459200, value: "5.2" }
|
|
249
|
+
]);
|
|
250
|
+
});
|
|
251
|
+
it("should require options parameter for getIndexChange", async () => {
|
|
252
|
+
await expect(action.getIndexChange(streamLocator)).rejects.toThrow("Options parameter is required for cache-aware getIndexChange");
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
describe("parameter validation", () => {
|
|
256
|
+
it("should validate cache parameters", async () => {
|
|
257
|
+
await expect(action.getRecord(streamLocator, { useCache: "true" })).rejects.toThrow("Invalid useCache parameter: must be a boolean");
|
|
258
|
+
await expect(action.getRecord(streamLocator, { from: -1 })).rejects.toThrow("Invalid from parameter: must be a non-negative number");
|
|
259
|
+
await expect(action.getRecord(streamLocator, { from: 100, to: 50 })).rejects.toThrow("Invalid time range: from time cannot be greater than to time");
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
//# sourceMappingURL=cache.integration.test.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/contracts-api/cache.integration.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, it, expect, vi, beforeEach } from 'vitest';\nimport { Action } from './action';\nimport { EthereumAddress } from '../util/EthereumAddress';\nimport { StreamId } from '../util/StreamId';\nimport type { StreamLocator } from '../types/stream';\nimport { CacheMetadata } from '../types/cache';\n\n// Mock Kwil client\nconst mockKwilClient = {\n call: vi.fn(),\n execute: vi.fn()\n};\n\nconst mockKwilSigner = {};\n\ndescribe('Cache Integration Tests', () => {\n let action: Action;\n let streamLocator: StreamLocator;\n\n beforeEach(() => {\n action = new Action(mockKwilClient as any, mockKwilSigner as any);\n streamLocator = {\n streamId: StreamId.fromString('test-stream').unwrap(),\n dataProvider: new EthereumAddress('0x1234567890123456789012345678901234567890')\n };\n \n // Reset mocks\n vi.clearAllMocks();\n });\n\n describe('getRecord cache functionality', () => {\n it('should handle cache-aware getRecord call', async () => {\n const mockResponse = {\n status: 200,\n data: {\n result: [\n { event_time: 1609459200, value: '100' },\n { event_time: 1609459260, value: '101' }\n ],\n logs: '1. cache_hit: true\\n2. other log\\n111. cache_miss: false'\n }\n };\n\n mockKwilClient.call.mockResolvedValue(mockResponse);\n\n const result = await action.getRecord(streamLocator, {\n from: 1609459200,\n to: 1609459300,\n useCache: true\n });\n\n expect(mockKwilClient.call).toHaveBeenCalledWith(\n {\n namespace: 'main',\n name: 'get_record',\n inputs: {\n $data_provider: '0x1234567890123456789012345678901234567890',\n $stream_id: 'test-stream',\n $from: 1609459200,\n $to: 1609459300,\n $frozen_at: undefined,\n $use_cache: true\n }\n },\n mockKwilSigner\n );\n\n expect(result).toEqual({\n data: [\n { eventTime: 1609459200, value: '100' },\n { eventTime: 1609459260, value: '101' }\n ],\n cache: undefined,\n logs: ['cache_hit: true', 'other log', 'cache_miss: false']\n });\n });\n\n it('should handle cache-aware getRecord call with cache metadata', async () => {\n const mockResponse = {\n status: 200,\n data: {\n result: [\n { event_time: 1609459200, value: '100' }\n ],\n logs: '1. {\"cache_hit\":true,\"cache_disabled\":false,\"cache_height\":148670}'\n }\n };\n\n mockKwilClient.call.mockResolvedValue(mockResponse);\n\n const result = await action.getRecord(streamLocator, {\n useCache: true\n });\n\n // Cache metadata extraction happens in the parser\n // We'll just verify the structure is correct\n expect(result).toHaveProperty('data');\n expect(result).toHaveProperty('cache');\n expect(result).toHaveProperty('logs');\n expect(result.data).toEqual([\n { eventTime: 1609459200, value: '100' }\n ]);\n\n expect(result.cache).toMatchObject({\n hit: true,\n cacheDisabled: false,\n height: 148670,\n dataProvider: '0x1234567890123456789012345678901234567890',\n from: undefined,\n frozenAt: undefined,\n rowsServed: 1,\n streamId: 'test-stream',\n to: undefined\n } as CacheMetadata);\n\n expect(result.logs).toMatchObject(['{\"cache_hit\":true,\"cache_disabled\":false,\"cache_height\":148670}']);\n });\n\n it('should omit useCache parameter when not provided', async () => {\n const mockResponse = {\n status: 200,\n data: { result: [] }\n };\n\n mockKwilClient.call.mockResolvedValue(mockResponse);\n\n await action.getRecord(streamLocator, {\n from: 1609459200\n });\n\n expect(mockKwilClient.call).toHaveBeenCalledWith(\n {\n namespace: 'main',\n name: 'get_record',\n inputs: {\n $data_provider: '0x1234567890123456789012345678901234567890',\n $stream_id: 'test-stream',\n $from: 1609459200,\n $to: undefined,\n $frozen_at: undefined\n }\n },\n mockKwilSigner\n );\n });\n\n it('should handle error responses', async () => {\n mockKwilClient.call.mockResolvedValue({\n status: 500,\n data: null\n });\n\n await expect(action.getRecord(streamLocator, { useCache: true }))\n .rejects.toThrow('Failed to get record: 500');\n });\n });\n\n describe('getIndex cache functionality', () => {\n it('should handle cache-aware getIndex call', async () => {\n const mockResponse = {\n status: 200,\n data: {\n result: [\n { event_time: 1609459200, value: '100' }\n ]\n }\n };\n\n mockKwilClient.call.mockResolvedValue(mockResponse);\n\n const result = await action.getIndex(streamLocator, {\n from: 1609459200,\n to: 1609459300,\n baseTime: 1609459180,\n useCache: true\n });\n\n expect(mockKwilClient.call).toHaveBeenCalledWith(\n {\n namespace: 'main',\n name: 'get_index',\n inputs: {\n $data_provider: '0x1234567890123456789012345678901234567890',\n $stream_id: 'test-stream',\n $from: 1609459200,\n $to: 1609459300,\n $frozen_at: undefined,\n $base_time: 1609459180,\n $use_cache: true\n }\n },\n mockKwilSigner\n );\n\n expect(result.data).toEqual([\n { eventTime: 1609459200, value: '100' }\n ]);\n });\n });\n\n describe('getFirstRecord cache functionality', () => {\n it('should handle cache-aware getFirstRecord call', async () => {\n const mockResponse = {\n status: 200,\n data: {\n result: [\n { event_time: 1609459200, value: '100' }\n ]\n }\n };\n\n mockKwilClient.call.mockResolvedValue(mockResponse);\n\n const result = await action.getFirstRecord(streamLocator, {\n after: 1609459180,\n useCache: true\n });\n\n expect(mockKwilClient.call).toHaveBeenCalledWith(\n {\n namespace: 'main',\n name: 'get_first_record',\n inputs: {\n $data_provider: '0x1234567890123456789012345678901234567890',\n $stream_id: 'test-stream',\n $after: 1609459180,\n $frozen_at: undefined,\n $use_cache: true\n }\n },\n mockKwilSigner\n );\n\n expect(result.data).toEqual({\n eventTime: 1609459200,\n value: '100'\n });\n });\n\n it('should handle empty result for getFirstRecord', async () => {\n const mockResponse = {\n status: 200,\n data: { result: [] }\n };\n\n mockKwilClient.call.mockResolvedValue(mockResponse);\n\n const result = await action.getFirstRecord(streamLocator, {\n useCache: true\n });\n\n expect(result.data).toBeNull();\n });\n });\n\n describe('getIndexChange cache functionality', () => {\n it('should handle cache-aware getIndexChange call', async () => {\n const mockResponse = {\n status: 200,\n data: {\n result: [\n { event_time: 1609459200, value: '5.2' }\n ]\n }\n };\n\n mockKwilClient.call.mockResolvedValue(mockResponse);\n\n const result = await action.getIndexChange(streamLocator, {\n from: 1609459200,\n to: 1609459300,\n timeInterval: 60,\n useCache: true\n });\n\n expect(mockKwilClient.call).toHaveBeenCalledWith(\n {\n namespace: 'main',\n name: 'get_index_change',\n inputs: {\n $data_provider: '0x1234567890123456789012345678901234567890',\n $stream_id: 'test-stream',\n $from: 1609459200,\n $to: 1609459300,\n $frozen_at: undefined,\n $base_time: undefined,\n $time_interval: 60,\n $use_cache: true\n }\n },\n mockKwilSigner\n );\n\n expect(result.data).toEqual([\n { eventTime: 1609459200, value: '5.2' }\n ]);\n });\n\n it('should require options parameter for getIndexChange', async () => {\n await expect((action.getIndexChange as any)(streamLocator))\n .rejects.toThrow('Options parameter is required for cache-aware getIndexChange');\n });\n });\n\n describe('parameter validation', () => {\n it('should validate cache parameters', async () => {\n await expect(action.getRecord(streamLocator, { useCache: 'true' as any }))\n .rejects.toThrow('Invalid useCache parameter: must be a boolean');\n\n await expect(action.getRecord(streamLocator, { from: -1 }))\n .rejects.toThrow('Invalid from parameter: must be a non-negative number');\n\n await expect(action.getRecord(streamLocator, { from: 100, to: 50 }))\n .rejects.toThrow('Invalid time range: from time cannot be greater than to time');\n });\n });\n});"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -93,6 +93,92 @@ var ComposedAction = class _ComposedAction extends Action {
|
|
|
93
93
|
});
|
|
94
94
|
return txHash;
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Lists taxonomies by block height range for incremental synchronization.
|
|
98
|
+
* Enables efficient detection of taxonomy changes since a specific block height.
|
|
99
|
+
*
|
|
100
|
+
* @param params Height range and pagination parameters
|
|
101
|
+
* @returns Promise resolving to taxonomy query results
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* const taxonomies = await composedAction.listTaxonomiesByHeight({
|
|
106
|
+
* fromHeight: 1000,
|
|
107
|
+
* toHeight: 2000,
|
|
108
|
+
* limit: 100,
|
|
109
|
+
* latestOnly: true
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
async listTaxonomiesByHeight(params = {}) {
|
|
114
|
+
const result = await this.call(
|
|
115
|
+
"list_taxonomies_by_height",
|
|
116
|
+
{
|
|
117
|
+
$from_height: params.fromHeight ?? null,
|
|
118
|
+
$to_height: params.toHeight ?? null,
|
|
119
|
+
$limit: params.limit ?? null,
|
|
120
|
+
$offset: params.offset ?? null,
|
|
121
|
+
$latest_only: params.latestOnly ?? null
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
return result.mapRight(
|
|
125
|
+
(records) => records.map((record) => ({
|
|
126
|
+
dataProvider: EthereumAddress.fromString(record.data_provider).throw(),
|
|
127
|
+
streamId: StreamId.fromString(record.stream_id).throw(),
|
|
128
|
+
childDataProvider: EthereumAddress.fromString(record.child_data_provider).throw(),
|
|
129
|
+
childStreamId: StreamId.fromString(record.child_stream_id).throw(),
|
|
130
|
+
weight: record.weight,
|
|
131
|
+
createdAt: record.created_at,
|
|
132
|
+
groupSequence: record.group_sequence,
|
|
133
|
+
startTime: record.start_time
|
|
134
|
+
}))
|
|
135
|
+
).throw();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Gets taxonomies for specific streams in batch.
|
|
139
|
+
* Useful for validating taxonomy data for known streams.
|
|
140
|
+
*
|
|
141
|
+
* @param params Stream locators and filtering options
|
|
142
|
+
* @returns Promise resolving to taxonomy query results
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* const taxonomies = await composedAction.getTaxonomiesForStreams({
|
|
147
|
+
* streams: [
|
|
148
|
+
* { dataProvider: provider1, streamId: streamId1 },
|
|
149
|
+
* { dataProvider: provider2, streamId: streamId2 }
|
|
150
|
+
* ],
|
|
151
|
+
* latestOnly: true
|
|
152
|
+
* });
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
async getTaxonomiesForStreams(params) {
|
|
156
|
+
if (!params.streams || params.streams.length === 0) {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
const dataProviders = params.streams.map((s) => s.dataProvider.getAddress());
|
|
160
|
+
const streamIds = params.streams.map((s) => s.streamId.getId());
|
|
161
|
+
const result = await this.call(
|
|
162
|
+
"get_taxonomies_for_streams",
|
|
163
|
+
{
|
|
164
|
+
$data_providers: dataProviders,
|
|
165
|
+
$stream_ids: streamIds,
|
|
166
|
+
$latest_only: params.latestOnly ?? null
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
return result.mapRight(
|
|
170
|
+
(records) => records.map((record) => ({
|
|
171
|
+
dataProvider: EthereumAddress.fromString(record.data_provider).throw(),
|
|
172
|
+
streamId: StreamId.fromString(record.stream_id).throw(),
|
|
173
|
+
childDataProvider: EthereumAddress.fromString(record.child_data_provider).throw(),
|
|
174
|
+
childStreamId: StreamId.fromString(record.child_stream_id).throw(),
|
|
175
|
+
weight: record.weight,
|
|
176
|
+
createdAt: record.created_at,
|
|
177
|
+
groupSequence: record.group_sequence,
|
|
178
|
+
startTime: record.start_time
|
|
179
|
+
}))
|
|
180
|
+
).throw();
|
|
181
|
+
}
|
|
96
182
|
/**
|
|
97
183
|
* Creates a ComposedStream from a base Stream
|
|
98
184
|
* @param stream The base stream to convert
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/contracts-api/composedAction.ts"],
|
|
4
|
-
"sourcesContent": ["import {KwilSigner, NodeKwil, Utils, WebKwil} from \"@trufnetwork/kwil-js\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { Action } from \"./action\";\nimport DataType = Utils.DataType;\n\nexport const ErrorStreamNotComposed = \"stream is not a composed stream\";\n\nexport interface TaxonomySet {\n stream: StreamLocator;\n taxonomyItems: TaxonomyItem[];\n startDate: number;\n}\n\nexport interface TaxonomyItem {\n childStream: StreamLocator;\n weight: string;\n}\n\nexport interface DescribeTaxonomiesParams {\n stream: StreamLocator;\n /**\n * if true, will return the latest version of the taxonomy only\n */\n latestGroupSequence: boolean;\n}\n\nexport class ComposedAction extends Action {\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n ) {\n super(kwilClient, kwilSigner);\n }\n\n /**\n * Returns the taxonomy of the stream\n * @param params Parameters for describing taxonomies\n * @returns A promise that resolves to the taxonomy\n */\n public async describeTaxonomies(\n params: DescribeTaxonomiesParams,\n ): Promise<TaxonomySet[]> {\n type TaxonomyResult = {\n data_provider: string;\n stream_id: string;\n child_data_provider: string;\n child_stream_id: string;\n weight: string;\n created_at: number;\n group_sequence: number;\n start_date: number;\n }[];\n\n const result = await this.call<TaxonomyResult>(\n \"describe_taxonomies\",\n {\n $data_provider: params.stream.dataProvider.getAddress(),\n $stream_id: params.stream.streamId.getId(),\n $latest_group_sequence: params.latestGroupSequence,\n },\n );\n\n\n\n return result\n .mapRight((records) => {\n const taxonomyItems: Map<DateString, TaxonomyItem[]> = records.reduce(\n (acc, record) => {\n const currentArray = acc.get(record.start_date.toString()) || [];\n currentArray.push({\n childStream: {\n streamId: StreamId.fromString(record.child_stream_id).throw(),\n dataProvider: EthereumAddress.fromString(\n record.child_data_provider,\n ).throw(),\n },\n weight: record.weight,\n });\n acc.set(record.start_date.toString(), currentArray);\n return acc;\n },\n new Map<DateString, TaxonomyItem[]>(),\n );\n\n return Array.from(taxonomyItems.entries()).map(\n ([startDate, taxonomyItems]) => ({\n stream: {\n streamId: StreamId.fromString(records[0].stream_id).throw(),\n dataProvider: EthereumAddress.fromString(\n records[0].data_provider,\n ).throw(),\n },\n taxonomyItems,\n startDate: Number(startDate)\n }),\n );\n })\n .throw();\n }\n\n /**\n * Sets the taxonomy of the stream\n * @param taxonomy The taxonomy to set\n * @returns A promise that resolves to the transaction receipt\n */\n public async setTaxonomy(\n taxonomy: TaxonomySet,\n ): Promise<GenericResponse<TxReceipt>> {\n const childDataProviders: string[] = [];\n const childStreamIds: string[] = [];\n const weights: string[] = [];\n\n for (const item of taxonomy.taxonomyItems) {\n childDataProviders.push(item.childStream.dataProvider\n .getAddress());\n childStreamIds.push(item.childStream.streamId.getId());\n weights.push(item.weight.toString());\n }\n\n const txHash = await this.executeWithActionBody({\n namespace: \"main\",\n name: \"insert_taxonomy\",\n inputs: [\n {\n $data_provider: taxonomy.stream.dataProvider.getAddress(),\n $stream_id: taxonomy.stream.streamId.getId(),\n $child_data_providers: childDataProviders,\n $child_stream_ids: childStreamIds,\n $weights: weights,\n $start_date: taxonomy.startDate\n },\n ],\n types: {\n $data_provider: DataType.Text,\n $stream_id: DataType.Text,\n $child_data_providers: DataType.TextArray,\n $child_stream_ids: DataType.TextArray,\n $weights: DataType.NumericArray(36,18),\n $start_date: DataType.Int\n }});\n\n return txHash;\n }\n\n /**\n * Creates a ComposedStream from a base Stream\n * @param stream The base stream to convert\n * @returns A ComposedStream instance\n */\n public static fromStream(stream: Action): ComposedAction {\n return new ComposedAction(\n stream[\"kwilClient\"],\n stream[\"kwilSigner\"],\n );\n }\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,SAA8B,aAAqB;AAKnD,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,IAAO,WAAW,MAAM;AAEjB,IAAM,yBAAyB;
|
|
4
|
+
"sourcesContent": ["import {KwilSigner, NodeKwil, Utils, WebKwil} from \"@trufnetwork/kwil-js\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { Action } from \"./action\";\nimport DataType = Utils.DataType;\n\nexport const ErrorStreamNotComposed = \"stream is not a composed stream\";\n\nexport interface TaxonomySet {\n stream: StreamLocator;\n taxonomyItems: TaxonomyItem[];\n startDate: number;\n}\n\nexport interface TaxonomyItem {\n childStream: StreamLocator;\n weight: string;\n}\n\nexport interface DescribeTaxonomiesParams {\n stream: StreamLocator;\n /**\n * if true, will return the latest version of the taxonomy only\n */\n latestGroupSequence: boolean;\n}\n\nexport interface ListTaxonomiesByHeightParams {\n /** Start height (inclusive). If null, uses earliest available. */\n fromHeight?: number;\n /** End height (inclusive). If null, uses current height. */\n toHeight?: number;\n /** Maximum number of results to return. Default: 1000 */\n limit?: number;\n /** Number of results to skip for pagination. Default: 0 */\n offset?: number;\n /** If true, returns only latest group_sequence per stream. Default: false */\n latestOnly?: boolean;\n}\n\nexport interface GetTaxonomiesForStreamsParams {\n /** Array of stream locators to query */\n streams: StreamLocator[];\n /** If true, returns only latest group_sequence per stream. Default: false */\n latestOnly?: boolean;\n}\n\nexport interface TaxonomyQueryResult {\n /** Parent stream data provider */\n dataProvider: EthereumAddress;\n /** Parent stream ID */\n streamId: StreamId;\n /** Child stream data provider */\n childDataProvider: EthereumAddress;\n /** Child stream ID */\n childStreamId: StreamId;\n /** Weight of the child stream in the taxonomy */\n weight: string;\n /** Block height when taxonomy was created */\n createdAt: number;\n /** Group sequence number for this taxonomy set */\n groupSequence: number;\n /** Start time timestamp for this taxonomy */\n startTime: number;\n}\n\nexport class ComposedAction extends Action {\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n ) {\n super(kwilClient, kwilSigner);\n }\n\n /**\n * Returns the taxonomy of the stream\n * @param params Parameters for describing taxonomies\n * @returns A promise that resolves to the taxonomy\n */\n public async describeTaxonomies(\n params: DescribeTaxonomiesParams,\n ): Promise<TaxonomySet[]> {\n type TaxonomyResult = {\n data_provider: string;\n stream_id: string;\n child_data_provider: string;\n child_stream_id: string;\n weight: string;\n created_at: number;\n group_sequence: number;\n start_date: number;\n }[];\n\n const result = await this.call<TaxonomyResult>(\n \"describe_taxonomies\",\n {\n $data_provider: params.stream.dataProvider.getAddress(),\n $stream_id: params.stream.streamId.getId(),\n $latest_group_sequence: params.latestGroupSequence,\n },\n );\n\n\n\n return result\n .mapRight((records) => {\n const taxonomyItems: Map<DateString, TaxonomyItem[]> = records.reduce(\n (acc, record) => {\n const currentArray = acc.get(record.start_date.toString()) || [];\n currentArray.push({\n childStream: {\n streamId: StreamId.fromString(record.child_stream_id).throw(),\n dataProvider: EthereumAddress.fromString(\n record.child_data_provider,\n ).throw(),\n },\n weight: record.weight,\n });\n acc.set(record.start_date.toString(), currentArray);\n return acc;\n },\n new Map<DateString, TaxonomyItem[]>(),\n );\n\n return Array.from(taxonomyItems.entries()).map(\n ([startDate, taxonomyItems]) => ({\n stream: {\n streamId: StreamId.fromString(records[0].stream_id).throw(),\n dataProvider: EthereumAddress.fromString(\n records[0].data_provider,\n ).throw(),\n },\n taxonomyItems,\n startDate: Number(startDate)\n }),\n );\n })\n .throw();\n }\n\n /**\n * Sets the taxonomy of the stream\n * @param taxonomy The taxonomy to set\n * @returns A promise that resolves to the transaction receipt\n */\n public async setTaxonomy(\n taxonomy: TaxonomySet,\n ): Promise<GenericResponse<TxReceipt>> {\n const childDataProviders: string[] = [];\n const childStreamIds: string[] = [];\n const weights: string[] = [];\n\n for (const item of taxonomy.taxonomyItems) {\n childDataProviders.push(item.childStream.dataProvider\n .getAddress());\n childStreamIds.push(item.childStream.streamId.getId());\n weights.push(item.weight.toString());\n }\n\n const txHash = await this.executeWithActionBody({\n namespace: \"main\",\n name: \"insert_taxonomy\",\n inputs: [\n {\n $data_provider: taxonomy.stream.dataProvider.getAddress(),\n $stream_id: taxonomy.stream.streamId.getId(),\n $child_data_providers: childDataProviders,\n $child_stream_ids: childStreamIds,\n $weights: weights,\n $start_date: taxonomy.startDate\n },\n ],\n types: {\n $data_provider: DataType.Text,\n $stream_id: DataType.Text,\n $child_data_providers: DataType.TextArray,\n $child_stream_ids: DataType.TextArray,\n $weights: DataType.NumericArray(36,18),\n $start_date: DataType.Int\n }});\n\n return txHash;\n }\n\n /**\n * Lists taxonomies by block height range for incremental synchronization.\n * Enables efficient detection of taxonomy changes since a specific block height.\n * \n * @param params Height range and pagination parameters\n * @returns Promise resolving to taxonomy query results\n * \n * @example\n * ```typescript\n * const taxonomies = await composedAction.listTaxonomiesByHeight({\n * fromHeight: 1000,\n * toHeight: 2000,\n * limit: 100,\n * latestOnly: true\n * });\n * ```\n */\n public async listTaxonomiesByHeight(\n params: ListTaxonomiesByHeightParams = {},\n ): Promise<TaxonomyQueryResult[]> {\n type TaxonomyRawResult = {\n data_provider: string;\n stream_id: string;\n child_data_provider: string;\n child_stream_id: string;\n weight: string;\n created_at: number;\n group_sequence: number;\n start_time: number;\n }[];\n\n const result = await this.call<TaxonomyRawResult>(\n \"list_taxonomies_by_height\",\n {\n $from_height: params.fromHeight ?? null,\n $to_height: params.toHeight ?? null,\n $limit: params.limit ?? null,\n $offset: params.offset ?? null,\n $latest_only: params.latestOnly ?? null,\n },\n );\n\n return result\n .mapRight((records) => \n records.map(record => ({\n dataProvider: EthereumAddress.fromString(record.data_provider).throw(),\n streamId: StreamId.fromString(record.stream_id).throw(),\n childDataProvider: EthereumAddress.fromString(record.child_data_provider).throw(),\n childStreamId: StreamId.fromString(record.child_stream_id).throw(),\n weight: record.weight,\n createdAt: record.created_at,\n groupSequence: record.group_sequence,\n startTime: record.start_time,\n }))\n )\n .throw();\n }\n\n /**\n * Gets taxonomies for specific streams in batch.\n * Useful for validating taxonomy data for known streams.\n * \n * @param params Stream locators and filtering options\n * @returns Promise resolving to taxonomy query results\n * \n * @example\n * ```typescript\n * const taxonomies = await composedAction.getTaxonomiesForStreams({\n * streams: [\n * { dataProvider: provider1, streamId: streamId1 },\n * { dataProvider: provider2, streamId: streamId2 }\n * ],\n * latestOnly: true\n * });\n * ```\n */\n public async getTaxonomiesForStreams(\n params: GetTaxonomiesForStreamsParams,\n ): Promise<TaxonomyQueryResult[]> {\n // Validate input\n if (!params.streams || params.streams.length === 0) {\n return [];\n }\n\n const dataProviders = params.streams.map(s => s.dataProvider.getAddress());\n const streamIds = params.streams.map(s => s.streamId.getId());\n\n type TaxonomyRawResult = {\n data_provider: string;\n stream_id: string;\n child_data_provider: string;\n child_stream_id: string;\n weight: string;\n created_at: number;\n group_sequence: number;\n start_time: number;\n }[];\n\n const result = await this.call<TaxonomyRawResult>(\n \"get_taxonomies_for_streams\",\n {\n $data_providers: dataProviders,\n $stream_ids: streamIds,\n $latest_only: params.latestOnly ?? null,\n },\n );\n\n return result\n .mapRight((records) => \n records.map(record => ({\n dataProvider: EthereumAddress.fromString(record.data_provider).throw(),\n streamId: StreamId.fromString(record.stream_id).throw(),\n childDataProvider: EthereumAddress.fromString(record.child_data_provider).throw(),\n childStreamId: StreamId.fromString(record.child_stream_id).throw(),\n weight: record.weight,\n createdAt: record.created_at,\n groupSequence: record.group_sequence,\n startTime: record.start_time,\n }))\n )\n .throw();\n }\n\n /**\n * Creates a ComposedStream from a base Stream\n * @param stream The base stream to convert\n * @returns A ComposedStream instance\n */\n public static fromStream(stream: Action): ComposedAction {\n return new ComposedAction(\n stream[\"kwilClient\"],\n stream[\"kwilSigner\"],\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["taxonomyItems"]
|
|
7
7
|
}
|