@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,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": "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",
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
  }