@trufnetwork/sdk-js 0.3.7 → 0.4.1

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 (108) hide show
  1. package/dist/cjs/client/browserClient.cjs +1 -1
  2. package/dist/cjs/client/browserClient.cjs.map +1 -1
  3. package/dist/cjs/client/client.cjs +1 -1
  4. package/dist/cjs/client/client.cjs.map +1 -1
  5. package/dist/cjs/client/getLastTransactions.cjs.map +1 -1
  6. package/dist/cjs/client/listStreams.cjs.map +1 -1
  7. package/dist/cjs/client/nodeClient.cjs +1 -1
  8. package/dist/cjs/client/nodeClient.cjs.map +1 -1
  9. package/dist/cjs/contracts-api/action.cjs +301 -77
  10. package/dist/cjs/contracts-api/action.cjs.map +3 -3
  11. package/dist/cjs/contracts-api/cache.integration.test.cjs +265 -0
  12. package/dist/cjs/contracts-api/cache.integration.test.cjs.map +7 -0
  13. package/dist/cjs/contracts-api/composedAction.cjs +1 -1
  14. package/dist/cjs/contracts-api/composedAction.cjs.map +1 -1
  15. package/dist/cjs/contracts-api/deleteStream.cjs.map +1 -1
  16. package/dist/cjs/contracts-api/deployStream.cjs.map +1 -1
  17. package/dist/cjs/contracts-api/primitiveAction.cjs +1 -1
  18. package/dist/cjs/contracts-api/primitiveAction.cjs.map +1 -1
  19. package/dist/cjs/contracts-api/roleManagement.cjs +1 -1
  20. package/dist/cjs/contracts-api/roleManagement.cjs.map +1 -1
  21. package/dist/cjs/types/cache.cjs +34 -0
  22. package/dist/cjs/types/cache.cjs.map +7 -0
  23. package/dist/cjs/types/cache.test.cjs +205 -0
  24. package/dist/cjs/types/cache.test.cjs.map +7 -0
  25. package/dist/cjs/util/cacheMetadataParser.cjs +174 -0
  26. package/dist/cjs/util/cacheMetadataParser.cjs.map +7 -0
  27. package/dist/cjs/util/cacheMetadataParser.test.cjs +329 -0
  28. package/dist/cjs/util/cacheMetadataParser.test.cjs.map +7 -0
  29. package/dist/cjs/util/cacheValidation.cjs +88 -0
  30. package/dist/cjs/util/cacheValidation.cjs.map +7 -0
  31. package/dist/cjs/util/cacheValidation.test.cjs +108 -0
  32. package/dist/cjs/util/cacheValidation.test.cjs.map +7 -0
  33. package/dist/esm/client/browserClient.mjs +1 -1
  34. package/dist/esm/client/browserClient.mjs.map +1 -1
  35. package/dist/esm/client/client.mjs +1 -1
  36. package/dist/esm/client/client.mjs.map +1 -1
  37. package/dist/esm/client/getLastTransactions.mjs.map +1 -1
  38. package/dist/esm/client/listStreams.mjs.map +1 -1
  39. package/dist/esm/client/nodeClient.mjs +1 -1
  40. package/dist/esm/client/nodeClient.mjs.map +1 -1
  41. package/dist/esm/contracts-api/action.mjs +302 -77
  42. package/dist/esm/contracts-api/action.mjs.map +3 -3
  43. package/dist/esm/contracts-api/cache.integration.test.mjs +263 -0
  44. package/dist/esm/contracts-api/cache.integration.test.mjs.map +7 -0
  45. package/dist/esm/contracts-api/composedAction.mjs +1 -1
  46. package/dist/esm/contracts-api/composedAction.mjs.map +1 -1
  47. package/dist/esm/contracts-api/deleteStream.mjs.map +1 -1
  48. package/dist/esm/contracts-api/deployStream.mjs.map +1 -1
  49. package/dist/esm/contracts-api/primitiveAction.mjs +1 -1
  50. package/dist/esm/contracts-api/primitiveAction.mjs.map +1 -1
  51. package/dist/esm/contracts-api/roleManagement.mjs +1 -1
  52. package/dist/esm/contracts-api/roleManagement.mjs.map +1 -1
  53. package/dist/esm/types/cache.mjs +13 -0
  54. package/dist/esm/types/cache.mjs.map +7 -0
  55. package/dist/esm/types/cache.test.mjs +203 -0
  56. package/dist/esm/types/cache.test.mjs.map +7 -0
  57. package/dist/esm/util/cacheMetadataParser.mjs +153 -0
  58. package/dist/esm/util/cacheMetadataParser.mjs.map +7 -0
  59. package/dist/esm/util/cacheMetadataParser.test.mjs +327 -0
  60. package/dist/esm/util/cacheMetadataParser.test.mjs.map +7 -0
  61. package/dist/esm/util/cacheValidation.mjs +67 -0
  62. package/dist/esm/util/cacheValidation.mjs.map +7 -0
  63. package/dist/esm/util/cacheValidation.test.mjs +106 -0
  64. package/dist/esm/util/cacheValidation.test.mjs.map +7 -0
  65. package/dist/tsconfig.build.tsbuildinfo +1 -1
  66. package/dist/types/client/browserClient.d.ts +1 -1
  67. package/dist/types/client/browserClient.d.ts.map +1 -1
  68. package/dist/types/client/client.d.ts +8 -8
  69. package/dist/types/client/client.d.ts.map +1 -1
  70. package/dist/types/client/getLastTransactions.d.ts +1 -1
  71. package/dist/types/client/getLastTransactions.d.ts.map +1 -1
  72. package/dist/types/client/listStreams.d.ts +1 -1
  73. package/dist/types/client/listStreams.d.ts.map +1 -1
  74. package/dist/types/client/nodeClient.d.ts +1 -1
  75. package/dist/types/client/nodeClient.d.ts.map +1 -1
  76. package/dist/types/contracts-api/action.d.ts +17 -7
  77. package/dist/types/contracts-api/action.d.ts.map +1 -1
  78. package/dist/types/contracts-api/cache.integration.test.d.ts +2 -0
  79. package/dist/types/contracts-api/cache.integration.test.d.ts.map +1 -0
  80. package/dist/types/contracts-api/composedAction.d.ts +3 -3
  81. package/dist/types/contracts-api/composedAction.d.ts.map +1 -1
  82. package/dist/types/contracts-api/deleteStream.d.ts +4 -4
  83. package/dist/types/contracts-api/deleteStream.d.ts.map +1 -1
  84. package/dist/types/contracts-api/deployStream.d.ts +4 -4
  85. package/dist/types/contracts-api/deployStream.d.ts.map +1 -1
  86. package/dist/types/contracts-api/primitiveAction.d.ts +3 -3
  87. package/dist/types/contracts-api/primitiveAction.d.ts.map +1 -1
  88. package/dist/types/contracts-api/roleManagement.d.ts +3 -3
  89. package/dist/types/contracts-api/roleManagement.d.ts.map +1 -1
  90. package/dist/types/types/cache.d.ts +129 -0
  91. package/dist/types/types/cache.d.ts.map +1 -0
  92. package/dist/types/types/cache.test.d.ts +2 -0
  93. package/dist/types/types/cache.test.d.ts.map +1 -0
  94. package/dist/types/util/cacheMetadataParser.d.ts +38 -0
  95. package/dist/types/util/cacheMetadataParser.d.ts.map +1 -0
  96. package/dist/types/util/cacheMetadataParser.test.d.ts +2 -0
  97. package/dist/types/util/cacheMetadataParser.test.d.ts.map +1 -0
  98. package/dist/types/util/cacheValidation.d.ts +27 -0
  99. package/dist/types/util/cacheValidation.d.ts.map +1 -0
  100. package/dist/types/util/cacheValidation.test.d.ts +2 -0
  101. package/dist/types/util/cacheValidation.test.d.ts.map +1 -0
  102. package/package.json +5 -3
  103. package/dist/cjs/client/client.test.cjs +0 -32
  104. package/dist/cjs/client/client.test.cjs.map +0 -7
  105. package/dist/esm/client/client.test.mjs +0 -30
  106. package/dist/esm/client/client.test.mjs.map +0 -7
  107. package/dist/types/client/client.test.d.ts +0 -2
  108. package/dist/types/client/client.test.d.ts.map +0 -1
@@ -3,7 +3,7 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
 
5
5
  // src/client/client.ts
6
- import { Client, KwilSigner } from "@kwilteam/kwil-js";
6
+ import { Client, KwilSigner } from "@trufnetwork/kwil-js";
7
7
  import { ComposedAction } from "../contracts-api/composedAction.mjs";
8
8
  import { deployStream } from "../contracts-api/deployStream.mjs";
9
9
  import { deleteStream } from "../contracts-api/deleteStream.mjs";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/client.ts"],
4
- "sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil } from \"@kwilteam/kwil-js\";\nimport { KwilConfig } from \"@kwilteam/kwil-js/dist/api_client/config\";\nimport { Kwil } from \"@kwilteam/kwil-js/dist/client/kwil\";\nimport { EthSigner } from \"@kwilteam/kwil-js/dist/core/signature\";\nimport { EnvironmentType } from \"@kwilteam/kwil-js/dist/core/enums\";\nimport { GenericResponse } from \"@kwilteam/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@kwilteam/kwil-js/dist/core/tx\";\nimport { TxInfoReceipt } from \"@kwilteam/kwil-js/dist/core/txQuery\";\nimport { ComposedAction } from \"../contracts-api/composedAction\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { deleteStream } from \"../contracts-api/deleteStream\";\nimport { PrimitiveAction } from \"../contracts-api/primitiveAction\";\nimport { Action } from \"../contracts-api/action\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator, TNStream } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listStreams } from \"./listStreams\";\nimport { getLastTransactions } from \"./getLastTransactions\";\nimport { RoleManagement } from \"../contracts-api/roleManagement\";\nimport { OwnerIdentifier } from \"../types/role\";\n\nexport interface SignerInfo {\n // we need to have the address upfront to create the KwilSigner, instead of relying on the signer to return it asynchronously\n address: string;\n signer: EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n} & Omit<KwilConfig, \"kwilProvider\">;\n\nexport interface ListStreamsInput {\n dataProvider?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n blockHeight?: number;\n}\n\n/**\n * @param dataProvider optional address; when omitted or null, returns for all providers\n * @param limitSize max rows to return (default 6, max 100)\n */\nexport interface GetLastTransactionsInput {\n dataProvider?: string;\n limitSize?: number;\n}\n\nexport abstract class BaseTNClient<T extends EnvironmentType> {\n protected kwilClient: Kwil<T> | undefined;\n protected signerInfo: SignerInfo;\n\n protected constructor(options: TNClientOptions) {\n this.signerInfo = options.signerInfo;\n }\n\n /**\n * Waits for a transaction to be mined by TN.\n * @param txHash - The transaction hash to wait for.\n * @param timeout - The timeout in milliseconds.\n * @returns A promise that resolves to the transaction info receipt.\n */\n async waitForTx(txHash: string, timeout = 12000): Promise<TxInfoReceipt> {\n return new Promise<TxInfoReceipt>(async (resolve, reject) => {\n const interval = setInterval(async () => {\n const receipt = await this.getKwilClient()\n [\"txInfoClient\"](txHash)\n .catch(() => ({ data: undefined, status: undefined }));\n switch (receipt.status) {\n case 200:\n if (receipt.data?.tx_result?.log !== undefined && receipt.data?.tx_result?.log.includes(\"ERROR\")) {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ))\n } else {\n resolve(receipt.data!);\n }\n break;\n case undefined:\n break;\n default:\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\n }\n }, 1000);\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(\"Transaction failed: Timeout\"));\n }, timeout);\n });\n }\n\n /**\n * Returns the Kwil signer used by the client.\n * @returns An instance of KwilSigner.\n */\n getKwilSigner(): KwilSigner {\n return new KwilSigner(\n this.signerInfo.signer,\n this.address().getAddress(),\n );\n }\n\n /**\n * Returns the Kwil client used by the client.\n * @returns An instance of Kwil.\n * @throws If the Kwil client is not initialized.\n */\n getKwilClient(): Kwil<EnvironmentType> {\n if (!this.kwilClient) {\n throw new Error(\"Kwil client not initialized\");\n }\n return this.kwilClient;\n }\n\n /**\n * Deploys a new stream.\n * @param streamId - The ID of the stream to deploy.\n * @param streamType - The type of the stream.\n * @param synchronous - Whether the deployment should be synchronous.\n * @param contractVersion\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async deployStream(\n streamId: StreamId,\n streamType: StreamType,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Destroys a stream.\n * @param stream - The StreamLocator of the stream to destroy.\n * @param synchronous - Whether the destruction should be synchronous.\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async destroyStream(\n stream: StreamLocator,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deleteStream({\n stream,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Loads an already deployed stream, permitting its API usage.\n * @returns An instance of IStream.\n */\n loadAction(): Action {\n return new Action(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Loads a primitive stream.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveAction(): PrimitiveAction {\n return PrimitiveAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads a composed stream.\n * @returns An instance of IComposedStream.\n */\n loadComposedAction(): ComposedAction {\n return ComposedAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads the role management contract API, permitting its RBAC usage.\n */\n loadRoleManagementAction(): RoleManagement {\n return RoleManagement.fromClient(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Creates a new stream locator.\n * @param streamId - The ID of the stream.\n * @returns A StreamLocator object.\n */\n ownStreamLocator(streamId: StreamId): StreamLocator {\n return {\n streamId,\n dataProvider: this.address(),\n };\n }\n\n /**\n * Returns the address of the signer used by the client.\n * @returns An instance of EthereumAddress.\n */\n address(): EthereumAddress {\n return new EthereumAddress(this.signerInfo.address);\n }\n\n /**\n * Returns all streams from the TN network.\n * @param input - The input parameters for listing streams.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getListStreams(input: ListStreamsInput): Promise<TNStream[]> {\n return listStreams(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Returns the last write activity across streams.\n * @param input - The input parameters for getting last transactions.\n * @returns A promise that resolves to a list of last transactions.\n */\n async getLastTransactions(input: GetLastTransactionsInput): Promise<any[]> {\n return getLastTransactions(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.\n * @param provider - The provider URL.\n * @returns A promise that resolves to the chain ID.\n */\n public static async getDefaultChainId(provider: string) {\n const kwilClient = new Client({\n kwilProvider: provider,\n });\n const chainInfo = await kwilClient[\"chainInfoClient\"]();\n return chainInfo.data?.chain_id;\n }\n\n /*\n * High-level role-management helpers. These wrap the lower-level\n * RoleManagement contract calls and expose a simpler API on the\n * TN client.\n */\n\n /** Grants a role to one or more wallets. */\n async grantRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.grantRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /** Revokes a role from one or more wallets. */\n async revokeRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.revokeRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /**\n * Checks if a wallet is member of a role.\n * Returns true if the wallet is a member.\n */\n async isMemberOf(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallet: EthereumAddress;\n }): Promise<boolean> {\n const rm = this.loadRoleManagementAction();\n const res = await rm.areMembersOf({\n owner: input.owner,\n roleName: input.roleName,\n wallets: [input.wallet],\n });\n return res.length > 0 && res[0].isMember;\n }\n\n /**\n * Lists role members \u2013 currently unsupported in the\n * smart-contract layer.\n */\n async listRoleMembers(input: {\n owner: OwnerIdentifier;\n roleName: string;\n limit?: number;\n offset?: number;\n }): Promise<import(\"../types/role\").RoleMember[]> {\n const rm = this.loadRoleManagementAction();\n return rm.listRoleMembers({\n owner: input.owner,\n roleName: input.roleName,\n limit: input.limit,\n offset: input.offset,\n });\n }\n}\n"],
4
+ "sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil } from \"@trufnetwork/kwil-js\";\nimport { KwilConfig } from \"@trufnetwork/kwil-js/dist/api_client/config\";\nimport { Kwil } from \"@trufnetwork/kwil-js/dist/client/kwil\";\nimport { EthSigner } from \"@trufnetwork/kwil-js/dist/core/signature\";\nimport { EnvironmentType } from \"@trufnetwork/kwil-js/dist/core/enums\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { TxInfoReceipt } from \"@trufnetwork/kwil-js/dist/core/txQuery\";\nimport { ComposedAction } from \"../contracts-api/composedAction\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { deleteStream } from \"../contracts-api/deleteStream\";\nimport { PrimitiveAction } from \"../contracts-api/primitiveAction\";\nimport { Action } from \"../contracts-api/action\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator, TNStream } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listStreams } from \"./listStreams\";\nimport { getLastTransactions } from \"./getLastTransactions\";\nimport { RoleManagement } from \"../contracts-api/roleManagement\";\nimport { OwnerIdentifier } from \"../types/role\";\n\nexport interface SignerInfo {\n // we need to have the address upfront to create the KwilSigner, instead of relying on the signer to return it asynchronously\n address: string;\n signer: EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n} & Omit<KwilConfig, \"kwilProvider\">;\n\nexport interface ListStreamsInput {\n dataProvider?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n blockHeight?: number;\n}\n\n/**\n * @param dataProvider optional address; when omitted or null, returns for all providers\n * @param limitSize max rows to return (default 6, max 100)\n */\nexport interface GetLastTransactionsInput {\n dataProvider?: string;\n limitSize?: number;\n}\n\nexport abstract class BaseTNClient<T extends EnvironmentType> {\n protected kwilClient: Kwil<T> | undefined;\n protected signerInfo: SignerInfo;\n\n protected constructor(options: TNClientOptions) {\n this.signerInfo = options.signerInfo;\n }\n\n /**\n * Waits for a transaction to be mined by TN.\n * @param txHash - The transaction hash to wait for.\n * @param timeout - The timeout in milliseconds.\n * @returns A promise that resolves to the transaction info receipt.\n */\n async waitForTx(txHash: string, timeout = 12000): Promise<TxInfoReceipt> {\n return new Promise<TxInfoReceipt>(async (resolve, reject) => {\n const interval = setInterval(async () => {\n const receipt = await this.getKwilClient()\n [\"txInfoClient\"](txHash)\n .catch(() => ({ data: undefined, status: undefined }));\n switch (receipt.status) {\n case 200:\n if (receipt.data?.tx_result?.log !== undefined && receipt.data?.tx_result?.log.includes(\"ERROR\")) {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ))\n } else {\n resolve(receipt.data!);\n }\n break;\n case undefined:\n break;\n default:\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\n }\n }, 1000);\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(\"Transaction failed: Timeout\"));\n }, timeout);\n });\n }\n\n /**\n * Returns the Kwil signer used by the client.\n * @returns An instance of KwilSigner.\n */\n getKwilSigner(): KwilSigner {\n return new KwilSigner(\n this.signerInfo.signer,\n this.address().getAddress(),\n );\n }\n\n /**\n * Returns the Kwil client used by the client.\n * @returns An instance of Kwil.\n * @throws If the Kwil client is not initialized.\n */\n getKwilClient(): Kwil<EnvironmentType> {\n if (!this.kwilClient) {\n throw new Error(\"Kwil client not initialized\");\n }\n return this.kwilClient;\n }\n\n /**\n * Deploys a new stream.\n * @param streamId - The ID of the stream to deploy.\n * @param streamType - The type of the stream.\n * @param synchronous - Whether the deployment should be synchronous.\n * @param contractVersion\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async deployStream(\n streamId: StreamId,\n streamType: StreamType,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Destroys a stream.\n * @param stream - The StreamLocator of the stream to destroy.\n * @param synchronous - Whether the destruction should be synchronous.\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async destroyStream(\n stream: StreamLocator,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deleteStream({\n stream,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Loads an already deployed stream, permitting its API usage.\n * @returns An instance of IStream.\n */\n loadAction(): Action {\n return new Action(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Loads a primitive stream.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveAction(): PrimitiveAction {\n return PrimitiveAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads a composed stream.\n * @returns An instance of IComposedStream.\n */\n loadComposedAction(): ComposedAction {\n return ComposedAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads the role management contract API, permitting its RBAC usage.\n */\n loadRoleManagementAction(): RoleManagement {\n return RoleManagement.fromClient(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Creates a new stream locator.\n * @param streamId - The ID of the stream.\n * @returns A StreamLocator object.\n */\n ownStreamLocator(streamId: StreamId): StreamLocator {\n return {\n streamId,\n dataProvider: this.address(),\n };\n }\n\n /**\n * Returns the address of the signer used by the client.\n * @returns An instance of EthereumAddress.\n */\n address(): EthereumAddress {\n return new EthereumAddress(this.signerInfo.address);\n }\n\n /**\n * Returns all streams from the TN network.\n * @param input - The input parameters for listing streams.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getListStreams(input: ListStreamsInput): Promise<TNStream[]> {\n return listStreams(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Returns the last write activity across streams.\n * @param input - The input parameters for getting last transactions.\n * @returns A promise that resolves to a list of last transactions.\n */\n async getLastTransactions(input: GetLastTransactionsInput): Promise<any[]> {\n return getLastTransactions(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.\n * @param provider - The provider URL.\n * @returns A promise that resolves to the chain ID.\n */\n public static async getDefaultChainId(provider: string) {\n const kwilClient = new Client({\n kwilProvider: provider,\n });\n const chainInfo = await kwilClient[\"chainInfoClient\"]();\n return chainInfo.data?.chain_id;\n }\n\n /*\n * High-level role-management helpers. These wrap the lower-level\n * RoleManagement contract calls and expose a simpler API on the\n * TN client.\n */\n\n /** Grants a role to one or more wallets. */\n async grantRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.grantRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /** Revokes a role from one or more wallets. */\n async revokeRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.revokeRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /**\n * Checks if a wallet is member of a role.\n * Returns true if the wallet is a member.\n */\n async isMemberOf(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallet: EthereumAddress;\n }): Promise<boolean> {\n const rm = this.loadRoleManagementAction();\n const res = await rm.areMembersOf({\n owner: input.owner,\n roleName: input.roleName,\n wallets: [input.wallet],\n });\n return res.length > 0 && res[0].isMember;\n }\n\n /**\n * Lists role members \u2013 currently unsupported in the\n * smart-contract layer.\n */\n async listRoleMembers(input: {\n owner: OwnerIdentifier;\n roleName: string;\n limit?: number;\n offset?: number;\n }): Promise<import(\"../types/role\").RoleMember[]> {\n const rm = this.loadRoleManagementAction();\n return rm.listRoleMembers({\n owner: input.owner,\n roleName: input.roleName,\n limit: input.limit,\n offset: input.offset,\n });\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/getLastTransactions.ts"],
4
- "sourcesContent": ["import { WebKwil, NodeKwil, KwilSigner } from \"@kwilteam/kwil-js\";\r\nimport { GetLastTransactionsInput } from \"./client\";\r\nimport { LastTransaction } from \"../types/transaction\";\r\n\r\nconst INDEXER_BASE = \"https://indexer.infra.truf.network\";\r\nconst RPC_URL = \"https://gateway.mainnet.truf.network/rpc/v1\";\r\n\r\nexport async function getLastTransactions(\r\n kwilClient: WebKwil | NodeKwil,\r\n kwilSigner: KwilSigner,\r\n input: GetLastTransactionsInput\r\n): Promise<LastTransaction[]> {\r\n // 1) call your SQL action\r\n const res = await kwilClient.call(\r\n {\r\n name: \"get_last_transactions\",\r\n namespace: \"main\",\r\n inputs: {\r\n $data_provider: input.dataProvider ?? null,\r\n $limit_size: input.limitSize ?? 6,\r\n },\r\n },\r\n kwilSigner\r\n );\r\n const rows = (res.data?.result as { created_at: number; method: string }[]) || [];\r\n\r\n // 2) build per-block Promises\r\n const tasks = rows.map(({ created_at, method }) => {\r\n const blockHeight = Number(created_at);\r\n if (Number.isNaN(blockHeight)) {\r\n return Promise.reject(new Error(`Invalid block height returned: ${created_at}`));\r\n }\r\n\r\n const txUrl = `${INDEXER_BASE}/v0/chain/transactions`\r\n + `?from-block=${blockHeight}&to-block=${blockHeight}`\r\n + `&order=asc&limit=1`;\r\n\r\n // INDEXER: always return a { sender, hash } object\r\n const txPromise = fetch(txUrl).then(async (resp) => {\r\n if (!resp.ok) throw new Error(`Indexer fetch failed: ${resp.status}`);\r\n const json = (await resp.json()) as {\r\n ok: boolean;\r\n data: Array<{ hash: string; sender: string }>;\r\n };\r\n if (!json.ok || json.data.length === 0) {\r\n return { sender: \"(unknown)\", hash: \"(unknown)\" };\r\n }\r\n const { hash, sender } = json.data[0];\r\n return { sender, hash };\r\n });\r\n\r\n // RPC: get stamp_ms\r\n const rpcPromise = fetch(RPC_URL, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({\r\n jsonrpc: \"2.0\",\r\n method: \"chain.block\",\r\n params: { height: blockHeight },\r\n id: 1,\r\n }),\r\n }).then(async (resp) => {\r\n if (!resp.ok) {\r\n const txt = await resp.text();\r\n throw new Error(`RPC fetch failed: ${resp.status} \u2013 ${txt}`);\r\n }\r\n const rpc = (await resp.json()) as {\r\n result: { block: { header: { stamp_ms: number } } };\r\n };\r\n return rpc.result.block.header.stamp_ms;\r\n });\r\n\r\n // wait for both\r\n return Promise.all([txPromise, rpcPromise]).then(\r\n ([{ sender, hash }, stampMs]) => ({\r\n blockHeight,\r\n method,\r\n sender,\r\n transactionHash: hash,\r\n stampMs,\r\n })\r\n );\r\n });\r\n\r\n // 3) await all in parallel\r\n return Promise.all(tasks);\r\n}\r\n"],
4
+ "sourcesContent": ["import { WebKwil, NodeKwil, KwilSigner } from \"@trufnetwork/kwil-js\";\r\nimport { GetLastTransactionsInput } from \"./client\";\r\nimport { LastTransaction } from \"../types/transaction\";\r\n\r\nconst INDEXER_BASE = \"https://indexer.infra.truf.network\";\r\nconst RPC_URL = \"https://gateway.mainnet.truf.network/rpc/v1\";\r\n\r\nexport async function getLastTransactions(\r\n kwilClient: WebKwil | NodeKwil,\r\n kwilSigner: KwilSigner,\r\n input: GetLastTransactionsInput\r\n): Promise<LastTransaction[]> {\r\n // 1) call your SQL action\r\n const res = await kwilClient.call(\r\n {\r\n name: \"get_last_transactions\",\r\n namespace: \"main\",\r\n inputs: {\r\n $data_provider: input.dataProvider ?? null,\r\n $limit_size: input.limitSize ?? 6,\r\n },\r\n },\r\n kwilSigner\r\n );\r\n const rows = (res.data?.result as { created_at: number; method: string }[]) || [];\r\n\r\n // 2) build per-block Promises\r\n const tasks = rows.map(({ created_at, method }) => {\r\n const blockHeight = Number(created_at);\r\n if (Number.isNaN(blockHeight)) {\r\n return Promise.reject(new Error(`Invalid block height returned: ${created_at}`));\r\n }\r\n\r\n const txUrl = `${INDEXER_BASE}/v0/chain/transactions`\r\n + `?from-block=${blockHeight}&to-block=${blockHeight}`\r\n + `&order=asc&limit=1`;\r\n\r\n // INDEXER: always return a { sender, hash } object\r\n const txPromise = fetch(txUrl).then(async (resp) => {\r\n if (!resp.ok) throw new Error(`Indexer fetch failed: ${resp.status}`);\r\n const json = (await resp.json()) as {\r\n ok: boolean;\r\n data: Array<{ hash: string; sender: string }>;\r\n };\r\n if (!json.ok || json.data.length === 0) {\r\n return { sender: \"(unknown)\", hash: \"(unknown)\" };\r\n }\r\n const { hash, sender } = json.data[0];\r\n return { sender, hash };\r\n });\r\n\r\n // RPC: get stamp_ms\r\n const rpcPromise = fetch(RPC_URL, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({\r\n jsonrpc: \"2.0\",\r\n method: \"chain.block\",\r\n params: { height: blockHeight },\r\n id: 1,\r\n }),\r\n }).then(async (resp) => {\r\n if (!resp.ok) {\r\n const txt = await resp.text();\r\n throw new Error(`RPC fetch failed: ${resp.status} \u2013 ${txt}`);\r\n }\r\n const rpc = (await resp.json()) as {\r\n result: { block: { header: { stamp_ms: number } } };\r\n };\r\n return rpc.result.block.header.stamp_ms;\r\n });\r\n\r\n // wait for both\r\n return Promise.all([txPromise, rpcPromise]).then(\r\n ([{ sender, hash }, stampMs]) => ({\r\n blockHeight,\r\n method,\r\n sender,\r\n transactionHash: hash,\r\n stampMs,\r\n })\r\n );\r\n });\r\n\r\n // 3) await all in parallel\r\n return Promise.all(tasks);\r\n}\r\n"],
5
5
  "mappings": ";AAIA,IAAM,eAAe;AACrB,IAAM,UAAe;AAErB,eAAsB,oBAClB,YACA,YACA,OAC0B;AAE1B,QAAM,MAAM,MAAM,WAAW;AAAA,IACzB;AAAA,MACI,MAAM;AAAA,MACN,WAAW;AAAA,MACX,QAAQ;AAAA,QACJ,gBAAgB,MAAM,gBAAgB;AAAA,QACtC,aAAa,MAAM,aAAa;AAAA,MACpC;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AACA,QAAM,OAAQ,IAAI,MAAM,UAAuD,CAAC;AAGhF,QAAM,QAAQ,KAAK,IAAI,CAAC,EAAE,YAAY,OAAO,MAAM;AAC/C,UAAM,cAAc,OAAO,UAAU;AACrC,QAAI,OAAO,MAAM,WAAW,GAAG;AAC3B,aAAO,QAAQ,OAAO,IAAI,MAAM,kCAAkC,UAAU,EAAE,CAAC;AAAA,IACnF;AAEA,UAAM,QAAQ,GAAG,YAAY,qCACR,WAAW,aAAa,WAAW;AAIxD,UAAM,YAAY,MAAM,KAAK,EAAE,KAAK,OAAO,SAAS;AAChD,UAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,yBAAyB,KAAK,MAAM,EAAE;AACpE,YAAM,OAAQ,MAAM,KAAK,KAAK;AAI9B,UAAI,CAAC,KAAK,MAAM,KAAK,KAAK,WAAW,GAAG;AACpC,eAAO,EAAE,QAAQ,aAAa,MAAM,YAAY;AAAA,MACpD;AACA,YAAM,EAAE,MAAM,OAAO,IAAI,KAAK,KAAK,CAAC;AACpC,aAAO,EAAE,QAAQ,KAAK;AAAA,IAC1B,CAAC;AAGD,UAAM,aAAa,MAAM,SAAS;AAAA,MAC9B,QAAS;AAAA,MACT,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAS,KAAK,UAAU;AAAA,QACpB,SAAS;AAAA,QACT,QAAS;AAAA,QACT,QAAS,EAAE,QAAQ,YAAY;AAAA,QAC/B,IAAS;AAAA,MACb,CAAC;AAAA,IACL,CAAC,EAAE,KAAK,OAAO,SAAS;AACpB,UAAI,CAAC,KAAK,IAAI;AACV,cAAM,MAAM,MAAM,KAAK,KAAK;AAC5B,cAAM,IAAI,MAAM,qBAAqB,KAAK,MAAM,WAAM,GAAG,EAAE;AAAA,MAC/D;AACA,YAAM,MAAO,MAAM,KAAK,KAAK;AAG7B,aAAO,IAAI,OAAO,MAAM,OAAO;AAAA,IACnC,CAAC;AAGD,WAAO,QAAQ,IAAI,CAAC,WAAW,UAAU,CAAC,EAAE;AAAA,MACxC,CAAC,CAAC,EAAE,QAAQ,KAAK,GAAG,OAAO,OAAO;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAC;AAGD,SAAO,QAAQ,IAAI,KAAK;AAC5B;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/listStreams.ts"],
4
- "sourcesContent": ["import {TNStream} from \"../types/stream\";\nimport {EthereumAddress} from \"../util/EthereumAddress\";\nimport {StreamId} from \"../util/StreamId\";\nimport {Database} from \"@kwilteam/kwil-js/dist/core/database\";\nimport {ListStreamsInput} from \"./client\";\nimport {KwilSigner, NodeKwil, WebKwil} from \"@kwilteam/kwil-js\";\n\n/**\n * List all streams from the TN network.\n * @param kwilClient - The Kwil client.\n * @param kwilSigner - The Kwil signer.\n * @param input - The input parameters for listing streams.\n * @returns A list of stream locators.\n */\nexport async function listStreams(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n input: ListStreamsInput\n): Promise<TNStream[]> {\n const result = await kwilClient.call({\n inputs: {\n $data_provider: input.dataProvider,\n $limit: input.limit,\n $offset: input.offset,\n $order_by: input.orderBy,\n $block_height: input.blockHeight,\n },\n name: \"list_streams\",\n namespace: \"main\",\n }, kwilSigner);\n\n return await Promise.all(\n (result.data?.result as {\n data_provider: string;\n stream_id: string;\n stream_type: string;\n created_at: number;\n }[]).map(async (database) => ({\n streamId: await StreamId.generate(database.stream_id),\n dataProvider: new EthereumAddress(database.data_provider),\n streamType: database.stream_type,\n createdAt: database.created_at\n }))\n );\n}"],
4
+ "sourcesContent": ["import {TNStream} from \"../types/stream\";\nimport {EthereumAddress} from \"../util/EthereumAddress\";\nimport {StreamId} from \"../util/StreamId\";\nimport {Database} from \"@trufnetwork/kwil-js/dist/core/database\";\nimport {ListStreamsInput} from \"./client\";\nimport {KwilSigner, NodeKwil, WebKwil} from \"@trufnetwork/kwil-js\";\n\n/**\n * List all streams from the TN network.\n * @param kwilClient - The Kwil client.\n * @param kwilSigner - The Kwil signer.\n * @param input - The input parameters for listing streams.\n * @returns A list of stream locators.\n */\nexport async function listStreams(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n input: ListStreamsInput\n): Promise<TNStream[]> {\n const result = await kwilClient.call({\n inputs: {\n $data_provider: input.dataProvider,\n $limit: input.limit,\n $offset: input.offset,\n $order_by: input.orderBy,\n $block_height: input.blockHeight,\n },\n name: \"list_streams\",\n namespace: \"main\",\n }, kwilSigner);\n\n return await Promise.all(\n (result.data?.result as {\n data_provider: string;\n stream_id: string;\n stream_type: string;\n created_at: number;\n }[]).map(async (database) => ({\n streamId: await StreamId.generate(database.stream_id),\n dataProvider: new EthereumAddress(database.data_provider),\n streamType: database.stream_type,\n createdAt: database.created_at\n }))\n );\n}"],
5
5
  "mappings": ";AACA,SAAQ,uBAAsB;AAC9B,SAAQ,gBAAe;AAYvB,eAAsB,YACpB,YACA,YACA,OACqB;AACnB,QAAM,SAAS,MAAM,WAAW,KAAK;AAAA,IACjC,QAAQ;AAAA,MACJ,gBAAgB,MAAM;AAAA,MACtB,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,eAAe,MAAM;AAAA,IACzB;AAAA,IACA,MAAM;AAAA,IACN,WAAW;AAAA,EACf,GAAG,UAAU;AAEb,SAAO,MAAM,QAAQ;AAAA,KAChB,OAAO,MAAM,QAKT,IAAI,OAAO,cAAc;AAAA,MAC1B,UAAU,MAAM,SAAS,SAAS,SAAS,SAAS;AAAA,MACpD,cAAc,IAAI,gBAAgB,SAAS,aAAa;AAAA,MACxD,YAAY,SAAS;AAAA,MACrB,WAAW,SAAS;AAAA,IACxB,EAAE;AAAA,EACN;AACJ;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  // src/client/nodeClient.ts
2
- import { NodeKwil } from "@kwilteam/kwil-js";
2
+ import { NodeKwil } from "@trufnetwork/kwil-js";
3
3
  import { BaseTNClient } from "./client.mjs";
4
4
  var NodeTNClient = class extends BaseTNClient {
5
5
  constructor(options) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/nodeClient.ts"],
4
- "sourcesContent": ["import { EnvironmentType } from \"@kwilteam/kwil-js/dist/core/enums\";\nimport { NodeKwil } from \"@kwilteam/kwil-js\";\nimport { BaseTNClient, TNClientOptions } from \"./client\";\n\nexport class NodeTNClient extends BaseTNClient<EnvironmentType.NODE> {\n constructor(options: TNClientOptions) {\n super(options);\n this.kwilClient = new NodeKwil({\n ...options,\n timeout: options.timeout ?? 30000,\n kwilProvider: options.endpoint,\n });\n }\n}\n\nexport default NodeTNClient;\n"],
4
+ "sourcesContent": ["import { EnvironmentType } from \"@trufnetwork/kwil-js/dist/core/enums\";\nimport { NodeKwil } from \"@trufnetwork/kwil-js\";\nimport { BaseTNClient, TNClientOptions } from \"./client\";\n\nexport class NodeTNClient extends BaseTNClient<EnvironmentType.NODE> {\n constructor(options: TNClientOptions) {\n super(options);\n this.kwilClient = new NodeKwil({\n ...options,\n timeout: options.timeout ?? 30000,\n kwilProvider: options.endpoint,\n });\n }\n}\n\nexport default NodeTNClient;\n"],
5
5
  "mappings": ";AACA,SAAS,gBAAgB;AACzB,SAAS,oBAAqC;AAEvC,IAAM,eAAN,cAA2B,aAAmC;AAAA,EACnE,YAAY,SAA0B;AACpC,UAAM,OAAO;AACb,SAAK,aAAa,IAAI,SAAS;AAAA,MAC7B,GAAG;AAAA,MACH,SAAS,QAAQ,WAAW;AAAA,MAC5B,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF;AAEA,IAAO,qBAAQ;",
6
6
  "names": []
7
7
  }
@@ -8,13 +8,15 @@ import { EthereumAddress } from "../util/EthereumAddress.mjs";
8
8
  import { head } from "../util/head.mjs";
9
9
  import { StreamId } from "../util/StreamId.mjs";
10
10
  import { toVisibilityEnum } from "../util/visibility.mjs";
11
+ import { CacheMetadataParser } from "../util/cacheMetadataParser.mjs";
12
+ import { CacheValidation } from "../util/cacheValidation.mjs";
11
13
  import {
12
14
  MetadataKey,
13
15
  MetadataKeyValueMap,
14
16
  MetadataTableKey,
15
17
  StreamType
16
18
  } from "./contractValues.mjs";
17
- var Action = class {
19
+ var _Action = class _Action {
18
20
  constructor(kwilClient, kwilSigner) {
19
21
  __publicField(this, "kwilClient");
20
22
  __publicField(this, "kwilSigner");
@@ -58,50 +60,159 @@ var Action = class {
58
60
  }
59
61
  return Either.right(result.data?.result);
60
62
  }
61
- /**
62
- * Returns the records of the stream within the given date range
63
- */
64
- async getRecord(input) {
65
- const prefix = input.prefix ? input.prefix : "";
66
- const result = await this.call(
67
- prefix + "get_record",
68
- {
69
- $data_provider: input.stream.dataProvider.getAddress(),
70
- $stream_id: input.stream.streamId.getId(),
71
- $from: input.from,
72
- $to: input.to,
73
- $frozen_at: input.frozenAt
63
+ async getRecord(inputOrStream, options) {
64
+ if ("stream" in inputOrStream) {
65
+ const input = inputOrStream;
66
+ if (!_Action._legacyWarnEmitted.getRecord) {
67
+ _Action._legacyWarnEmitted.getRecord = true;
68
+ if (typeof console !== "undefined" && console.warn) {
69
+ console.warn("[TN SDK] Deprecated signature: getRecord(input). Use getRecord(stream, options?) instead.");
70
+ }
74
71
  }
72
+ const prefix2 = input.prefix ? input.prefix : "";
73
+ const result2 = await this.call(
74
+ prefix2 + "get_record",
75
+ {
76
+ $data_provider: input.stream.dataProvider.getAddress(),
77
+ $stream_id: input.stream.streamId.getId(),
78
+ $from: input.from,
79
+ $to: input.to,
80
+ $frozen_at: input.frozenAt
81
+ }
82
+ );
83
+ return result2.mapRight(
84
+ (result3) => result3.map((row) => ({
85
+ eventTime: row.event_time,
86
+ value: row.value
87
+ }))
88
+ ).throw();
89
+ }
90
+ const stream = inputOrStream;
91
+ if (options) {
92
+ CacheValidation.validateGetRecordOptions(options);
93
+ CacheValidation.validateTimeRange(options.from, options.to);
94
+ }
95
+ const prefix = options?.prefix ? options.prefix : "";
96
+ const params = {
97
+ $data_provider: stream.dataProvider.getAddress(),
98
+ $stream_id: stream.streamId.getId(),
99
+ $from: options?.from,
100
+ $to: options?.to,
101
+ $frozen_at: options?.frozenAt
102
+ };
103
+ if (options?.useCache !== void 0) {
104
+ params.$use_cache = options.useCache;
105
+ }
106
+ const result = await this.kwilClient.call(
107
+ {
108
+ namespace: "main",
109
+ name: prefix + "get_record",
110
+ inputs: params
111
+ },
112
+ this.kwilSigner
75
113
  );
76
- return result.mapRight(
77
- (result2) => result2.map((row) => ({
78
- eventTime: row.event_time,
79
- value: row.value
80
- }))
81
- ).throw();
114
+ if (result.status !== 200) {
115
+ throw new Error(`Failed to get record: ${result.status}`);
116
+ }
117
+ const data = (result.data?.result).map((row) => ({
118
+ eventTime: row.event_time,
119
+ value: row.value
120
+ }));
121
+ let cache = CacheMetadataParser.extractFromResponse(result);
122
+ if (cache) {
123
+ cache = {
124
+ ...cache,
125
+ streamId: stream.streamId.getId(),
126
+ dataProvider: stream.dataProvider.getAddress(),
127
+ from: options?.from,
128
+ to: options?.to,
129
+ frozenAt: options?.frozenAt,
130
+ rowsServed: data.length
131
+ };
132
+ }
133
+ return {
134
+ data,
135
+ cache: cache || void 0,
136
+ logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : void 0
137
+ };
82
138
  }
83
- /**
84
- * Returns the index of the stream within the given date range
85
- */
86
- async getIndex(input) {
87
- const prefix = input.prefix ? input.prefix : "";
88
- const result = await this.call(
89
- prefix + "get_index",
90
- {
91
- $data_provider: input.stream.dataProvider.getAddress(),
92
- $stream_id: input.stream.streamId.getId(),
93
- $from: input.from,
94
- $to: input.to,
95
- $frozen_at: input.frozenAt,
96
- $base_time: input.baseTime
139
+ async getIndex(inputOrStream, options) {
140
+ if ("stream" in inputOrStream) {
141
+ const input = inputOrStream;
142
+ if (!_Action._legacyWarnEmitted.getIndex) {
143
+ _Action._legacyWarnEmitted.getIndex = true;
144
+ if (typeof console !== "undefined" && console.warn) {
145
+ console.warn("[TN SDK] Deprecated signature: getIndex(input). Use getIndex(stream, options?) instead.");
146
+ }
97
147
  }
148
+ const prefix2 = input.prefix ? input.prefix : "";
149
+ const result2 = await this.call(
150
+ prefix2 + "get_index",
151
+ {
152
+ $data_provider: input.stream.dataProvider.getAddress(),
153
+ $stream_id: input.stream.streamId.getId(),
154
+ $from: input.from,
155
+ $to: input.to,
156
+ $frozen_at: input.frozenAt,
157
+ $base_time: input.baseTime
158
+ }
159
+ );
160
+ return result2.mapRight(
161
+ (result3) => result3.map((row) => ({
162
+ eventTime: row.event_time,
163
+ value: row.value
164
+ }))
165
+ ).throw();
166
+ }
167
+ const stream = inputOrStream;
168
+ if (options) {
169
+ CacheValidation.validateGetIndexOptions(options);
170
+ CacheValidation.validateTimeRange(options.from, options.to);
171
+ }
172
+ const prefix = options?.prefix ? options.prefix : "";
173
+ const params = {
174
+ $data_provider: stream.dataProvider.getAddress(),
175
+ $stream_id: stream.streamId.getId(),
176
+ $from: options?.from,
177
+ $to: options?.to,
178
+ $frozen_at: options?.frozenAt,
179
+ $base_time: options?.baseTime
180
+ };
181
+ if (options?.useCache !== void 0) {
182
+ params.$use_cache = options.useCache;
183
+ }
184
+ const result = await this.kwilClient.call(
185
+ {
186
+ namespace: "main",
187
+ name: prefix + "get_index",
188
+ inputs: params
189
+ },
190
+ this.kwilSigner
98
191
  );
99
- return result.mapRight(
100
- (result2) => result2.map((row) => ({
101
- eventTime: row.event_time,
102
- value: row.value
103
- }))
104
- ).throw();
192
+ if (result.status !== 200) {
193
+ throw new Error(`Failed to get index: ${result.status}`);
194
+ }
195
+ const data = (result.data?.result).map((row) => ({
196
+ eventTime: row.event_time,
197
+ value: row.value
198
+ }));
199
+ let cache = CacheMetadataParser.extractFromResponse(result);
200
+ if (cache) {
201
+ cache = {
202
+ ...cache,
203
+ streamId: stream.streamId.getId(),
204
+ dataProvider: stream.dataProvider.getAddress(),
205
+ from: options?.from,
206
+ to: options?.to,
207
+ frozenAt: options?.frozenAt,
208
+ rowsServed: data.length
209
+ };
210
+ }
211
+ return {
212
+ data,
213
+ cache: cache || void 0,
214
+ logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : void 0
215
+ };
105
216
  }
106
217
  /**
107
218
  * Returns the type of the stream
@@ -125,25 +236,75 @@ var Action = class {
125
236
  }
126
237
  return type.value;
127
238
  }
128
- /**
129
- * Returns the first record of the stream
130
- */
131
- async getFirstRecord(input) {
132
- const result = await this.call(
133
- "get_first_record",
134
- {
135
- $data_provider: input.stream.dataProvider.getAddress(),
136
- $stream_id: input.stream.streamId.getId(),
137
- $after: input.after,
138
- $frozen_at: input.frozenAt
239
+ async getFirstRecord(inputOrStream, options) {
240
+ if ("stream" in inputOrStream) {
241
+ const input = inputOrStream;
242
+ if (!_Action._legacyWarnEmitted.getFirstRecord) {
243
+ _Action._legacyWarnEmitted.getFirstRecord = true;
244
+ if (typeof console !== "undefined" && console.warn) {
245
+ console.warn("[TN SDK] Deprecated signature: getFirstRecord(input). Use getFirstRecord(stream, options?) instead.");
246
+ }
139
247
  }
248
+ const result2 = await this.call(
249
+ "get_first_record",
250
+ {
251
+ $data_provider: input.stream.dataProvider.getAddress(),
252
+ $stream_id: input.stream.streamId.getId(),
253
+ $after: input.after,
254
+ $frozen_at: input.frozenAt
255
+ }
256
+ );
257
+ return result2.mapRight(head).mapRight(
258
+ (result3) => result3.map((result4) => ({
259
+ eventTime: result4.event_time,
260
+ value: result4.value
261
+ })).unwrapOr(null)
262
+ ).throw();
263
+ }
264
+ const stream = inputOrStream;
265
+ if (options) {
266
+ CacheValidation.validateGetFirstRecordOptions(options);
267
+ }
268
+ const params = {
269
+ $data_provider: stream.dataProvider.getAddress(),
270
+ $stream_id: stream.streamId.getId(),
271
+ $after: options?.after,
272
+ $frozen_at: options?.frozenAt
273
+ };
274
+ if (options?.useCache !== void 0) {
275
+ params.$use_cache = options.useCache;
276
+ }
277
+ const result = await this.kwilClient.call(
278
+ {
279
+ namespace: "main",
280
+ name: "get_first_record",
281
+ inputs: params
282
+ },
283
+ this.kwilSigner
140
284
  );
141
- return result.mapRight(head).mapRight(
142
- (result2) => result2.map((result3) => ({
143
- eventTime: result3.event_time,
144
- value: result3.value
145
- })).unwrapOr(null)
146
- ).throw();
285
+ if (result.status !== 200) {
286
+ throw new Error(`Failed to get first record: ${result.status}`);
287
+ }
288
+ const rawData = result.data?.result;
289
+ const data = rawData && rawData.length > 0 ? {
290
+ eventTime: rawData[0].event_time,
291
+ value: rawData[0].value
292
+ } : null;
293
+ let cache = CacheMetadataParser.extractFromResponse(result);
294
+ if (cache) {
295
+ cache = {
296
+ ...cache,
297
+ streamId: stream.streamId.getId(),
298
+ dataProvider: stream.dataProvider.getAddress(),
299
+ frozenAt: options?.frozenAt,
300
+ rowsServed: data ? 1 : 0
301
+ };
302
+ }
303
+ return {
304
+ data,
305
+ cache: cache || void 0,
306
+ logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : void 0
307
+ };
147
308
  }
148
309
  async setMetadata(stream, key, value) {
149
310
  return await this.executeWithNamedParams("insert_metadata", [
@@ -300,28 +461,84 @@ var Action = class {
300
461
  };
301
462
  });
302
463
  }
303
- /**
304
- * Returns the index change of the stream within the given date range
305
- */
306
- async getIndexChange(input) {
307
- const result = await this.call(
308
- "get_index_change",
309
- {
310
- $data_provider: input.stream.dataProvider.getAddress(),
311
- $stream_id: input.stream.streamId.getId(),
312
- $from: input.from,
313
- $to: input.to,
314
- $frozen_at: input.frozenAt,
315
- $base_time: input.baseTime,
316
- $time_interval: input.timeInterval
464
+ async getIndexChange(inputOrStream, options) {
465
+ if ("stream" in inputOrStream) {
466
+ const input = inputOrStream;
467
+ if (!_Action._legacyWarnEmitted.getIndexChange) {
468
+ _Action._legacyWarnEmitted.getIndexChange = true;
469
+ if (typeof console !== "undefined" && console.warn) {
470
+ console.warn("[TN SDK] Deprecated signature: getIndexChange(input). Use getIndexChange(stream, options?) instead.");
471
+ }
317
472
  }
473
+ const result2 = await this.call(
474
+ "get_index_change",
475
+ {
476
+ $data_provider: input.stream.dataProvider.getAddress(),
477
+ $stream_id: input.stream.streamId.getId(),
478
+ $from: input.from,
479
+ $to: input.to,
480
+ $frozen_at: input.frozenAt,
481
+ $base_time: input.baseTime,
482
+ $time_interval: input.timeInterval
483
+ }
484
+ );
485
+ return result2.mapRight(
486
+ (result3) => result3.map((row) => ({
487
+ eventTime: row.event_time,
488
+ value: row.value
489
+ }))
490
+ ).throw();
491
+ }
492
+ const stream = inputOrStream;
493
+ if (!options) {
494
+ throw new Error("Options parameter is required for cache-aware getIndexChange");
495
+ }
496
+ CacheValidation.validateGetIndexChangeOptions(options);
497
+ CacheValidation.validateTimeRange(options.from, options.to);
498
+ const params = {
499
+ $data_provider: stream.dataProvider.getAddress(),
500
+ $stream_id: stream.streamId.getId(),
501
+ $from: options.from,
502
+ $to: options.to,
503
+ $frozen_at: options.frozenAt,
504
+ $base_time: options.baseTime,
505
+ $time_interval: options.timeInterval
506
+ };
507
+ if (options.useCache !== void 0) {
508
+ params.$use_cache = options.useCache;
509
+ }
510
+ const result = await this.kwilClient.call(
511
+ {
512
+ namespace: "main",
513
+ name: "get_index_change",
514
+ inputs: params
515
+ },
516
+ this.kwilSigner
318
517
  );
319
- return result.mapRight(
320
- (result2) => result2.map((row) => ({
321
- eventTime: row.event_time,
322
- value: row.value
323
- }))
324
- ).throw();
518
+ if (result.status !== 200) {
519
+ throw new Error(`Failed to get index change: ${result.status}`);
520
+ }
521
+ const data = (result.data?.result).map((row) => ({
522
+ eventTime: row.event_time,
523
+ value: row.value
524
+ }));
525
+ let cache = CacheMetadataParser.extractFromResponse(result);
526
+ if (cache) {
527
+ cache = {
528
+ ...cache,
529
+ streamId: stream.streamId.getId(),
530
+ dataProvider: stream.dataProvider.getAddress(),
531
+ from: options.from,
532
+ to: options.to,
533
+ frozenAt: options.frozenAt,
534
+ rowsServed: data.length
535
+ };
536
+ }
537
+ return {
538
+ data,
539
+ cache: cache || void 0,
540
+ logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : void 0
541
+ };
325
542
  }
326
543
  /**
327
544
  * A custom method that accepts the procedure name and the input of GetRecordInput
@@ -380,6 +597,14 @@ var Action = class {
380
597
  }).throw();
381
598
  }
382
599
  };
600
+ /** Track if deprecation warnings were already emitted */
601
+ __publicField(_Action, "_legacyWarnEmitted", {
602
+ getRecord: false,
603
+ getIndex: false,
604
+ getFirstRecord: false,
605
+ getIndexChange: false
606
+ });
607
+ var Action = _Action;
383
608
  export {
384
609
  Action
385
610
  };