@trufnetwork/sdk-js 0.2.2 → 0.2.6

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 (39) hide show
  1. package/README.md +62 -3
  2. package/dist/cjs/client/client.cjs +12 -2
  3. package/dist/cjs/client/client.cjs.map +2 -2
  4. package/dist/cjs/client/client.test.cjs +1 -1
  5. package/dist/cjs/contracts-api/composedStream.cjs +51 -2
  6. package/dist/cjs/contracts-api/composedStream.cjs.map +3 -3
  7. package/dist/cjs/contracts-api/deployStream.cjs +26 -0
  8. package/dist/cjs/contracts-api/deployStream.cjs.map +3 -3
  9. package/dist/cjs/contracts-api/stream.cjs +23 -0
  10. package/dist/cjs/contracts-api/stream.cjs.map +2 -2
  11. package/dist/cjs/util/EthereumAddress.cjs +1 -1
  12. package/dist/cjs/util/StreamId.cjs +7 -2
  13. package/dist/cjs/util/StreamId.cjs.map +2 -2
  14. package/dist/esm/client/client.mjs +12 -2
  15. package/dist/esm/client/client.mjs.map +2 -2
  16. package/dist/esm/client/client.test.mjs +1 -1
  17. package/dist/esm/contracts-api/composedStream.mjs +45 -2
  18. package/dist/esm/contracts-api/composedStream.mjs.map +2 -2
  19. package/dist/esm/contracts-api/deployStream.mjs +16 -0
  20. package/dist/esm/contracts-api/deployStream.mjs.map +2 -2
  21. package/dist/esm/contracts-api/stream.mjs +23 -0
  22. package/dist/esm/contracts-api/stream.mjs.map +2 -2
  23. package/dist/esm/util/EthereumAddress.mjs +1 -1
  24. package/dist/esm/util/StreamId.mjs +7 -2
  25. package/dist/esm/util/StreamId.mjs.map +2 -2
  26. package/dist/tsconfig.build.tsbuildinfo +1 -1
  27. package/dist/types/client/client.d.ts +6 -0
  28. package/dist/types/client/client.d.ts.map +1 -1
  29. package/dist/types/client/listAllStreams.d.ts.map +1 -1
  30. package/dist/types/contracts-api/composedStream.d.ts +2 -1
  31. package/dist/types/contracts-api/composedStream.d.ts.map +1 -1
  32. package/dist/types/contracts-api/deployStream.d.ts +1 -0
  33. package/dist/types/contracts-api/deployStream.d.ts.map +1 -1
  34. package/dist/types/contracts-api/stream.d.ts +13 -0
  35. package/dist/types/contracts-api/stream.d.ts.map +1 -1
  36. package/dist/types/util/StreamId.d.ts +2 -0
  37. package/dist/types/util/StreamId.d.ts.map +1 -1
  38. package/dist/types/util/visibility.d.ts.map +1 -1
  39. package/package.json +3 -2
package/README.md CHANGED
@@ -5,7 +5,7 @@ The TN SDK provides developers with tools to interact with the Truf Network, a d
5
5
  ## Quick Start
6
6
 
7
7
  ### Prerequisites
8
- - Node.js 18 or later
8
+ - Node.js 18 or later (For enabling Explorer-related features, please use Node.js 18)
9
9
 
10
10
  ### Installation
11
11
  ```bash
@@ -27,6 +27,10 @@ import { BrowserTNClient } from "@trufnetwork/sdk-js";
27
27
 
28
28
  ```ts
29
29
  import { NodeTNClient, StreamId } from "@trufnetwork/sdk-js";
30
+ import { Wallet } from "ethers";
31
+
32
+ // Create a wallet
33
+ const wallet = new Wallet("0000000000000000000000000000000000000000000000000000000000000001");
30
34
 
31
35
  // Initialize client
32
36
  const client = new NodeTNClient({
@@ -35,7 +39,7 @@ const client = new NodeTNClient({
35
39
  address: wallet.address,
36
40
  signer: wallet, // Any object that implements signMessage
37
41
  },
38
- chainId: "tsn-1", // or use NodeTNClient.getDefaultChainId()
42
+ chainId: "truflation-staging-2024-11-22", // or use NodeTNClient.getDefaultChainId()
39
43
  });
40
44
 
41
45
  // Deploy and initialize a stream
@@ -62,10 +66,23 @@ const data = await stream.getRecord({
62
66
  });
63
67
  ```
64
68
 
69
+ ### Explorer interaction
70
+
71
+ To enable Explorer-related features, you need to set the `neonConnectionString` in the `NodeTNClient` constructor.
72
+ You can request the explorer write only connection string by contacting us.
73
+
74
+ ```ts
75
+ const client = new NodeTNClient({
76
+ // other options...
77
+ neonConnectionString: yourNeonConnectionString,
78
+ });
79
+ ```
80
+
65
81
  For a complete working example:
66
82
  - Check our [TN SDK Demo Repository](https://github.com/truflation/tsn-sdk-demo)
67
83
  - Try the [Live Demo on CodeSandbox](https://codesandbox.io/p/devbox/m2r3tt?file=%2Fsrc%2Froutes%2F%2Bpage.svelte)
68
84
  - Try reading from [a Truflation Stream on CodeSandbox with NodeJS](https://codesandbox.io/p/devbox/rtm7mn?file=%2Findex.ts%3A22%2C11)
85
+ - [**NEW**] Check out the [TN SDK JS Example Directory](./examples). It contains examples for stream deployment, stream initialization, data insertion, data retrieval, and stream destruction.
69
86
 
70
87
  ## Stream Types
71
88
 
@@ -96,7 +113,49 @@ import { ... } from "npm:@trufnetwork/sdk-js"
96
113
 
97
114
  ### Deno Environment Permissions
98
115
 
99
- By default, some dependencies requires environment permissions. If you need to run without environment permissions, please see [this GitHub issue](https://github.com/denoland/deno/issues/20898#issuecomment-2500396620) for workarounds.
116
+ By default, some dependencies requires environment permissions. If you need to run without environment permissions, please see [this GitHub issue](https://github.com/denoland/deno/issues/20898#issuecomment-2500396620) for workarounds.# Serverless Deployment Notes
117
+
118
+ ## Handling Crypto Hashing in Serverless Environments
119
+
120
+ When deploying to serverless environments, some Node.js modules like `crypto-hash` may not work as expected due to
121
+ compatibility issues. To resolve this, you can create a shim for the `crypto-hash` module and use
122
+ Webpack's `NormalModuleReplacementPlugin` to replace it during the build process.
123
+
124
+ ### Steps to Add a Crypto Hash Shim
125
+
126
+ #### 1. Create a Shim File
127
+
128
+ Add a new file named `crypto-hash-sync.js` to your project:
129
+
130
+ ```
131
+ import { createHash } from 'crypto';
132
+
133
+ export const sha1 = (input) => createHash('sha1').update(input).digest('hex');
134
+ export const sha256 = (input) => createHash('sha256').update(input).digest('hex');
135
+ export const sha384 = (input) => createHash('sha384').update(input).digest('hex');
136
+ export const sha512 = (input) => createHash('sha512').update(input).digest('hex');
137
+ ```
138
+
139
+ #### 2. Update Your Webpack Configuration
140
+
141
+ Modify your `next.config.js` (or equivalent Webpack configuration file) to include the following:
142
+
143
+ ```
144
+ const path = require('path');
145
+
146
+ module.exports = {
147
+ webpack: (config, {isServer, webpack}) => {
148
+ // Add shim for crypto-hash
149
+ config.plugins.push(
150
+ new webpack.NormalModuleReplacementPlugin(
151
+ /crypto-hash/,
152
+ path.resolve(__dirname, 'crypto-hash-sync.js')
153
+ )
154
+ );
155
+ return config;
156
+ }
157
+ };
158
+ ```
100
159
 
101
160
  ## Support
102
161
 
@@ -34,8 +34,10 @@ var import_listAllStreams = require("./listAllStreams.cjs");
34
34
  var BaseTNClient = class {
35
35
  kwilClient;
36
36
  signerInfo;
37
+ neonConnectionString;
37
38
  constructor(options) {
38
39
  this.signerInfo = options.signerInfo;
40
+ this.neonConnectionString = options.neonConnectionString;
39
41
  }
40
42
  /**
41
43
  * Waits for a transaction to be mined by TN.
@@ -96,6 +98,12 @@ var BaseTNClient = class {
96
98
  }
97
99
  return this.kwilClient;
98
100
  }
101
+ /**
102
+ * Returns the Neon connection string used by the client.
103
+ */
104
+ getNeonConnectionString() {
105
+ return this.neonConnectionString;
106
+ }
99
107
  /**
100
108
  * Deploys a new stream.
101
109
  * @param streamId - The ID of the stream to deploy.
@@ -111,7 +119,8 @@ var BaseTNClient = class {
111
119
  synchronous,
112
120
  kwilClient: this.getKwilClient(),
113
121
  kwilSigner: this.getKwilSigner(),
114
- contractVersion
122
+ contractVersion,
123
+ neonConnectionString: this.getNeonConnectionString()
115
124
  });
116
125
  }
117
126
  /**
@@ -157,7 +166,8 @@ var BaseTNClient = class {
157
166
  return new import_composedStream.ComposedStream(
158
167
  this.getKwilClient(),
159
168
  this.getKwilSigner(),
160
- stream
169
+ stream,
170
+ this.getNeonConnectionString()
161
171
  );
162
172
  }
163
173
  /**
@@ -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/builders\";\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 { ComposedStream } from \"../contracts-api/composedStream\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { destroyStream } from \"../contracts-api/destroyStream\";\nimport { PrimitiveStream } from \"../contracts-api/primitiveStream\";\nimport { Stream } from \"../contracts-api/stream\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listAllStreams } from \"./listAllStreams\";\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 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 === \"success\") {\n resolve(receipt.data);\n } else {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\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 contractVersion?: number\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n contractVersion: contractVersion\n });\n }\n\n /**\n * Destroys a stream.\n * @param streamId - The ID 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 streamId: StreamId,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await destroyStream({\n streamId,\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 * @param stream - The locator of the stream to load.\n * @returns An instance of IStream.\n */\n loadStream(stream: StreamLocator): Stream {\n return new Stream(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n stream,\n );\n }\n\n /**\n * Loads a primitive stream.\n * @param stream - The locator of the primitive stream to load.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveStream(stream: StreamLocator): PrimitiveStream {\n return PrimitiveStream.fromStream(this.loadStream(stream));\n }\n\n /**\n * Loads a composed stream.\n * @param stream - The locator of the composed stream to load.\n * @returns An instance of IComposedStream.\n */\n loadComposedStream(stream: StreamLocator): ComposedStream {\n return new ComposedStream(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n stream,\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 owner - The owner of the streams. If not provided, all streams will be returned.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getAllStreams(owner?: EthereumAddress): Promise<StreamLocator[]> {\n return listAllStreams(this.getKwilClient(), owner);\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"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAsD;AAQtD,4BAA+B;AAC/B,0BAA6B;AAC7B,2BAA8B;AAC9B,6BAAgC;AAChC,oBAAuB;AAGvB,6BAAgC;AAEhC,4BAA+B;AAaxB,IAAe,eAAf,MAAuD;AAAA,EAClD;AAAA,EACA;AAAA,EAEA,YAAY,SAA0B;AAC9C,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,QAAgB,UAAU,MAA+B;AACvE,WAAO,IAAI,QAAuB,OAAO,SAAS,WAAW;AAC3D,YAAM,WAAW,YAAY,YAAY;AACvC,cAAM,UAAU,MAAM,KAAK,cAAc,EACtC,cAAc,EAAE,MAAM,EACtB,MAAM,OAAO,EAAE,MAAM,QAAW,QAAQ,OAAU,EAAE;AACvD,gBAAQ,QAAQ,QAAQ;AAAA,UACtB,KAAK;AACH,gBAAI,QAAQ,MAAM,UAAU,QAAQ,WAAW;AAC7C,sBAAQ,QAAQ,IAAI;AAAA,YACtB,OAAO;AACL;AAAA,gBACE,IAAI;AAAA,kBACF,8BAA8B,QAAQ,MAAM,kBAAkB,QAAQ,MAAM,UAAU,GAAG;AAAA,gBAC3F;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF,KAAK;AACH;AAAA,UACF;AACE;AAAA,cACE,IAAI;AAAA,gBACF,8BAA8B,QAAQ,MAAM,kBAAkB,QAAQ,MAAM,UAAU,GAAG;AAAA,cAC3F;AAAA,YACF;AAAA,QACJ;AAAA,MACF,GAAG,GAAI;AACP,iBAAW,MAAM;AACf,sBAAc,QAAQ;AACtB,eAAO,IAAI,MAAM,6BAA6B,CAAC;AAAA,MACjD,GAAG,OAAO;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAA4B;AAC1B,WAAO,IAAI;AAAA,MACT,KAAK,WAAW;AAAA,MAChB,KAAK,QAAQ,EAAE,WAAW;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAuC;AACrC,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aACJ,UACA,YACA,aACA,iBACqC;AACrC,WAAO,UAAM,kCAAa;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,KAAK,cAAc;AAAA,MAC/B,YAAY,KAAK,cAAc;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cACJ,UACA,aACqC;AACrC,WAAO,UAAM,oCAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA,YAAY,KAAK,cAAc;AAAA,MAC/B,YAAY,KAAK,cAAc;AAAA,IACjC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAA+B;AACxC,WAAO,IAAI;AAAA,MACT,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB,QAAwC;AAC1D,WAAO,uCAAgB,WAAW,KAAK,WAAW,MAAM,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,QAAuC;AACxD,WAAO,IAAI;AAAA,MACT,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,UAAmC;AAClD,WAAO;AAAA,MACL;AAAA,MACA,cAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAA2B;AACzB,WAAO,IAAI,uCAAgB,KAAK,WAAW,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,OAAmD;AACrE,eAAO,sCAAe,KAAK,cAAc,GAAG,KAAK;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAoB,kBAAkB,UAAkB;AACtD,UAAM,aAAa,IAAI,sBAAO;AAAA,MAC5B,cAAc;AAAA,IAChB,CAAC;AACD,UAAM,YAAY,MAAM,WAAW,iBAAiB,EAAE;AACtD,WAAO,UAAU,MAAM;AAAA,EACzB;AACF;",
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/builders\";\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 { ComposedStream } from \"../contracts-api/composedStream\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { destroyStream } from \"../contracts-api/destroyStream\";\nimport { PrimitiveStream } from \"../contracts-api/primitiveStream\";\nimport { Stream } from \"../contracts-api/stream\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listAllStreams } from \"./listAllStreams\";\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 neonConnectionString?: string;\n} & Omit<KwilConfig, \"kwilProvider\">;\n\nexport abstract class BaseTNClient<T extends EnvironmentType> {\n protected kwilClient: Kwil<T> | undefined;\n protected signerInfo: SignerInfo;\n protected neonConnectionString: string | undefined;\n\n protected constructor(options: TNClientOptions) {\n this.signerInfo = options.signerInfo;\n this.neonConnectionString = options.neonConnectionString;\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 === \"success\") {\n resolve(receipt.data);\n } else {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\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 * Returns the Neon connection string used by the client.\n */\n getNeonConnectionString(): string | undefined {\n return this.neonConnectionString;\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 contractVersion?: number\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n contractVersion: contractVersion,\n neonConnectionString: this.getNeonConnectionString(),\n });\n }\n\n /**\n * Destroys a stream.\n * @param streamId - The ID 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 streamId: StreamId,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await destroyStream({\n streamId,\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 * @param stream - The locator of the stream to load.\n * @returns An instance of IStream.\n */\n loadStream(stream: StreamLocator): Stream {\n return new Stream(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n stream,\n );\n }\n\n /**\n * Loads a primitive stream.\n * @param stream - The locator of the primitive stream to load.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveStream(stream: StreamLocator): PrimitiveStream {\n return PrimitiveStream.fromStream(this.loadStream(stream));\n }\n\n /**\n * Loads a composed stream.\n * @param stream - The locator of the composed stream to load.\n * @returns An instance of IComposedStream.\n */\n loadComposedStream(stream: StreamLocator): ComposedStream {\n return new ComposedStream(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n stream,\n this.getNeonConnectionString(),\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 owner - The owner of the streams. If not provided, all streams will be returned.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getAllStreams(owner?: EthereumAddress): Promise<StreamLocator[]> {\n return listAllStreams(this.getKwilClient(), owner);\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"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/client/client.test.ts
4
4
  var import_vitest = require("vitest");
5
- var import_ethers = require("ethers");
5
+ var import_ethers = require("ethers.cjs");
6
6
  var import_nodeClient = require("./nodeClient.cjs");
7
7
  import_vitest.describe.sequential("Client", { timeout: 3e4 }, () => {
8
8
  import_vitest.it.skipIf(process.env.CI);
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/contracts-api/composedStream.ts
@@ -29,10 +39,14 @@ var import_EthereumAddress = require("../util/EthereumAddress.cjs");
29
39
  var import_StreamId = require("../util/StreamId.cjs");
30
40
  var import_contractValues = require("./contractValues.cjs");
31
41
  var import_stream = require("./stream.cjs");
42
+ var import_pg = __toESM(require("pg"), 1);
43
+ var { Pool } = import_pg.default;
32
44
  var ErrorStreamNotComposed = "stream is not a composed stream";
33
45
  var ComposedStream = class _ComposedStream extends import_stream.Stream {
34
- constructor(kwilClient, kwilSigner, locator) {
46
+ neonConnectionString;
47
+ constructor(kwilClient, kwilSigner, locator, neonConnectionString) {
35
48
  super(kwilClient, kwilSigner, locator);
49
+ this.neonConnectionString = neonConnectionString;
36
50
  }
37
51
  /**
38
52
  * Checks if the stream is a valid composed stream.
@@ -112,7 +126,7 @@ var ComposedStream = class _ComposedStream extends import_stream.Stream {
112
126
  streamIds.push(item.childStream.streamId.getId());
113
127
  weights.push(item.weight.toString());
114
128
  }
115
- return this.checkedComposedExecute("set_taxonomy", [
129
+ const res = await this.checkedComposedExecute("set_taxonomy", [
116
130
  import_action.ActionInput.fromObject({
117
131
  $data_providers: dataProviders,
118
132
  $stream_ids: streamIds,
@@ -120,6 +134,41 @@ var ComposedStream = class _ComposedStream extends import_stream.Stream {
120
134
  $start_date: startDate
121
135
  })
122
136
  ]);
137
+ if (this.neonConnectionString) {
138
+ const pool = new Pool({ connectionString: this.neonConnectionString });
139
+ const parentProvider = this.locator.dataProvider.getAddress().slice(2);
140
+ const parentStreamId = this.locator.streamId.getId();
141
+ const startDateText = String(startDate);
142
+ for (const item of taxonomy.taxonomyItems) {
143
+ const childProvider = item.childStream.dataProvider.getAddress().slice(2);
144
+ const childStreamId = item.childStream.streamId.getId();
145
+ const weight = item.weight;
146
+ await pool.query(
147
+ `INSERT INTO taxonomies
148
+ (parent_data_provider, parent_stream_id,
149
+ child_data_provider, child_stream_id,
150
+ weight, start_date)
151
+ VALUES ($1, $2, $3, $4, $5, $6)
152
+ ON CONFLICT ON CONSTRAINT unique_parent_child DO NOTHING`,
153
+ [
154
+ parentProvider,
155
+ parentStreamId,
156
+ childProvider,
157
+ childStreamId,
158
+ weight,
159
+ startDateText
160
+ ]
161
+ );
162
+ }
163
+ await pool.end();
164
+ console.log("Successfully inserted taxonomy into Explorer DB", {
165
+ parentStreamId,
166
+ childStreamId: streamIds,
167
+ weight: weights,
168
+ startDate
169
+ });
170
+ }
171
+ return res;
123
172
  }
124
173
  /**
125
174
  * Creates a ComposedStream from a base Stream
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contracts-api/composedStream.ts"],
4
- "sourcesContent": ["import { KwilSigner, NodeKwil, WebKwil } from \"@kwilteam/kwil-js\";\nimport { ActionInput } from \"@kwilteam/kwil-js/dist/core/action\";\nimport { GenericResponse } from \"@kwilteam/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@kwilteam/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 { StreamType } from \"./contractValues\";\nimport { Stream } from \"./stream\";\n\nexport const ErrorStreamNotComposed = \"stream is not a composed stream\";\n\nexport interface TaxonomySet {\n taxonomyItems: TaxonomyItem[];\n startDate: DateString | number;\n}\n\nexport interface TaxonomyItem {\n childStream: StreamLocator;\n weight: string;\n}\n\nexport interface DescribeTaxonomiesParams {\n /**\n * if true, will return the latest version of the taxonomy only\n */\n latestVersion: boolean;\n}\n\nexport class ComposedStream extends Stream {\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n locator: StreamLocator,\n ) {\n super(kwilClient, kwilSigner, locator);\n }\n\n /**\n * Checks if the stream is a valid composed stream.\n * A valid composed stream must be:\n * - initialized\n * - of type composed\n */\n private async checkValidComposedStream(): Promise<void> {\n // First check if initialized\n await this.checkInitialized(StreamType.Composed);\n\n // Then check if is composed\n const streamType = await this.getType();\n if (streamType !== StreamType.Composed) {\n throw new Error(ErrorStreamNotComposed);\n }\n }\n\n /**\n * Executes a method after checking if the stream is a valid composed stream\n * @param method The method name to execute\n * @param inputs The inputs for the action\n * @returns A generic response containing the transaction receipt\n */\n private async checkedComposedExecute(\n method: string,\n inputs: ActionInput[],\n ): Promise<GenericResponse<TxReceipt>> {\n await this.checkValidComposedStream();\n return this.execute(method, inputs);\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 child_stream_id: string;\n child_data_provider: string;\n weight: string;\n created_at: number;\n version: number;\n start_date: string | number;\n }[];\n\n const result = await this.call<TaxonomyResult>(\"describe_taxonomies\", [\n ActionInput.fromObject({ $latest_version: params.latestVersion }),\n ]);\n\n return result\n .mapRight((records) => {\n const taxonomyItems: Map<DateString, TaxonomyItem[]> = records.reduce(\n (acc, record) => {\n const currentArray = acc.get(<string>record.start_date) || [];\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(<string>record.start_date, currentArray);\n return acc;\n },\n new Map<DateString, TaxonomyItem[]>(),\n );\n\n let startDate: string | number;\n if (records.length > 0 && records[0].start_date) {\n startDate = records[0].start_date;\n }\n\n return Array.from(taxonomyItems.entries()).map(\n ([startDate, taxonomyItems]) => ({\n startDate,\n taxonomyItems,\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 dataProviders: string[] = [];\n const streamIds: string[] = [];\n const weights: string[] = [];\n const startDate = taxonomy.startDate;\n\n for (const item of taxonomy.taxonomyItems) {\n const dataProviderHex = item.childStream.dataProvider\n .getAddress()\n .slice(2); // Remove 0x prefix\n dataProviders.push(dataProviderHex);\n streamIds.push(item.childStream.streamId.getId());\n weights.push(item.weight.toString());\n }\n\n return this.checkedComposedExecute(\"set_taxonomy\", [\n ActionInput.fromObject({\n $data_providers: dataProviders,\n $stream_ids: streamIds,\n $weights: weights,\n $start_date: startDate,\n }),\n ]);\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: Stream): ComposedStream {\n return new ComposedStream(\n stream[\"kwilClient\"],\n stream[\"kwilSigner\"],\n stream[\"locator\"],\n );\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["startDate", "taxonomyItems"]
4
+ "sourcesContent": ["import { KwilSigner, NodeKwil, WebKwil } from \"@kwilteam/kwil-js\";\nimport { ActionInput } from \"@kwilteam/kwil-js/dist/core/action\";\nimport { GenericResponse } from \"@kwilteam/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@kwilteam/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 { StreamType } from \"./contractValues\";\nimport { Stream } from \"./stream\";\nimport pg from \"pg\";\nconst { Pool } = pg;\n\nexport const ErrorStreamNotComposed = \"stream is not a composed stream\";\n\nexport interface TaxonomySet {\n taxonomyItems: TaxonomyItem[];\n startDate: DateString | number;\n}\n\nexport interface TaxonomyItem {\n childStream: StreamLocator;\n weight: string;\n}\n\nexport interface DescribeTaxonomiesParams {\n /**\n * if true, will return the latest version of the taxonomy only\n */\n latestVersion: boolean;\n}\n\nexport class ComposedStream extends Stream {\n protected neonConnectionString: string | undefined;\n\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n locator: StreamLocator,\n neonConnectionString?: string,\n ) {\n super(kwilClient, kwilSigner, locator);\n this.neonConnectionString = neonConnectionString;\n }\n\n /**\n * Checks if the stream is a valid composed stream.\n * A valid composed stream must be:\n * - initialized\n * - of type composed\n */\n private async checkValidComposedStream(): Promise<void> {\n // First check if initialized\n await this.checkInitialized(StreamType.Composed);\n\n // Then check if is composed\n const streamType = await this.getType();\n if (streamType !== StreamType.Composed) {\n throw new Error(ErrorStreamNotComposed);\n }\n }\n\n /**\n * Executes a method after checking if the stream is a valid composed stream\n * @param method The method name to execute\n * @param inputs The inputs for the action\n * @returns A generic response containing the transaction receipt\n */\n private async checkedComposedExecute(\n method: string,\n inputs: ActionInput[],\n ): Promise<GenericResponse<TxReceipt>> {\n await this.checkValidComposedStream();\n return this.execute(method, inputs);\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 child_stream_id: string;\n child_data_provider: string;\n weight: string;\n created_at: number;\n version: number;\n start_date: string | number;\n }[];\n\n const result = await this.call<TaxonomyResult>(\"describe_taxonomies\", [\n ActionInput.fromObject({ $latest_version: params.latestVersion }),\n ]);\n\n return result\n .mapRight((records) => {\n const taxonomyItems: Map<DateString, TaxonomyItem[]> = records.reduce(\n (acc, record) => {\n const currentArray = acc.get(<string>record.start_date) || [];\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(<string>record.start_date, currentArray);\n return acc;\n },\n new Map<DateString, TaxonomyItem[]>(),\n );\n\n let startDate: string | number;\n if (records.length > 0 && records[0].start_date) {\n startDate = records[0].start_date;\n }\n\n return Array.from(taxonomyItems.entries()).map(\n ([startDate, taxonomyItems]) => ({\n startDate,\n taxonomyItems,\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 dataProviders: string[] = [];\n const streamIds: string[] = [];\n const weights: string[] = [];\n const startDate = taxonomy.startDate;\n\n for (const item of taxonomy.taxonomyItems) {\n const dataProviderHex = item.childStream.dataProvider\n .getAddress()\n .slice(2); // Remove 0x prefix\n dataProviders.push(dataProviderHex);\n streamIds.push(item.childStream.streamId.getId());\n weights.push(item.weight.toString());\n }\n\n const res = await this.checkedComposedExecute(\"set_taxonomy\", [\n ActionInput.fromObject({\n $data_providers: dataProviders,\n $stream_ids: streamIds,\n $weights: weights,\n $start_date: startDate,\n }),\n ]);\n\n // Optional: insert into Postgres via neon connection if a connection string is provided\n if (this.neonConnectionString) {\n const pool = new Pool({ connectionString: this.neonConnectionString });\n\n // parent info comes from this.locator\n const parentProvider = this.locator.dataProvider.getAddress().slice(2);\n const parentStreamId = this.locator.streamId.getId();\n const startDateText = String(startDate);\n\n for (const item of taxonomy.taxonomyItems) {\n const childProvider = item.childStream.dataProvider.getAddress().slice(2);\n const childStreamId = item.childStream.streamId.getId();\n const weight = item.weight;\n\n await pool.query(\n `INSERT INTO taxonomies\n (parent_data_provider, parent_stream_id,\n child_data_provider, child_stream_id,\n weight, start_date)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT ON CONSTRAINT unique_parent_child DO NOTHING`,\n [\n parentProvider,\n parentStreamId,\n childProvider,\n childStreamId,\n weight,\n startDateText,\n ],\n );\n }\n\n await pool.end();\n console.log(\"Successfully inserted taxonomy into Explorer DB\", {\n parentStreamId,\n childStreamId: streamIds,\n weight: weights,\n startDate,\n });\n }\n\n\n return res;\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: Stream): ComposedStream {\n return new ComposedStream(\n stream[\"kwilClient\"],\n stream[\"kwilSigner\"],\n stream[\"locator\"],\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["pg", "startDate", "taxonomyItems"]
7
7
  }
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/contracts-api/deployStream.ts
@@ -25,6 +35,8 @@ __export(deployStream_exports, {
25
35
  module.exports = __toCommonJS(deployStream_exports);
26
36
  var import_contractValues = require("./contractValues.cjs");
27
37
  var import_contractsContent = require("../contracts/contractsContent.cjs");
38
+ var import_pg = __toESM(require("pg"), 1);
39
+ var { Pool } = import_pg.default;
28
40
  async function deployStream(input) {
29
41
  try {
30
42
  const schema = await getContract(input.streamType, input.contractVersion);
@@ -37,6 +49,20 @@ async function deployStream(input) {
37
49
  input.kwilSigner,
38
50
  input.synchronous
39
51
  );
52
+ if (input.neonConnectionString) {
53
+ console.log("Neon connection detected, attempting to insert into DB...");
54
+ const signer = input.kwilSigner.signer;
55
+ const dataProvider = signer.address.toLowerCase().substring(2);
56
+ const pool = new Pool({ connectionString: input.neonConnectionString });
57
+ await pool.query(
58
+ `INSERT INTO streams (data_provider, stream_id, type, stream_name, display_name, categories, owner_wallet, geography, tags)
59
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
60
+ ON CONFLICT (data_provider, stream_id) DO NOTHING`,
61
+ [dataProvider, input.streamId.getId(), input.streamType, input.streamId.getName(), input.streamId.getName(), "{External}", dataProvider, "Global", "{External}"]
62
+ );
63
+ await pool.end();
64
+ console.log("successfully inserted into Explorer DB", input.streamId.getName());
65
+ }
40
66
  return txHash;
41
67
  } catch (error) {
42
68
  throw new Error(`Failed to deploy stream: ${error}`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contracts-api/deployStream.ts"],
4
- "sourcesContent": ["import { StreamType } from \"./contractValues\";\nimport { TxReceipt } from \"@kwilteam/kwil-js/dist/core/tx\";\nimport { Kwil } from \"@kwilteam/kwil-js/dist/client/kwil\";\nimport { CompiledKuneiform } from \"@kwilteam/kwil-js/dist/core/payload\";\nimport {\n composedStreamTemplate,\n primitiveStreamTemplate,\n composedStreamTemplateUnix,\n primitiveStreamTemplateUnix\n} from \"../contracts/contractsContent\";\nimport { GenericResponse } from \"@kwilteam/kwil-js/dist/core/resreq\";\nimport { KwilSigner } from \"@kwilteam/kwil-js\";\nimport { StreamId } from \"../util/StreamId\";\n\nexport interface DeployStreamInput {\n streamId: StreamId;\n streamType: StreamType;\n kwilClient: Kwil<any>;\n kwilSigner: KwilSigner;\n synchronous?: boolean;\n contractVersion?: number;\n}\n\nexport interface DeployStreamOutput {\n receipt: TxReceipt;\n}\n\n/**\n * Deploys a stream to TN.\n * @param input - The input parameters for deploying the stream.\n * @returns The transaction hash of the deployment.\n */\nexport async function deployStream(\n input: DeployStreamInput,\n): Promise<GenericResponse<TxReceipt>> {\n try {\n const schema = await getContract(input.streamType, input.contractVersion);\n\n schema.name = input.streamId.getId();\n\n const txHash = await input.kwilClient.deploy(\n {\n schema,\n description: `TN SDK - Deploying ${input.streamType} stream: ${input.streamId.getId()}`,\n },\n input.kwilSigner,\n input.synchronous,\n );\n\n return txHash;\n } catch (error) {\n throw new Error(`Failed to deploy stream: ${error}`);\n }\n}\n\n/**\n * Returns the contract content based on the stream type.\n * @param streamType - The type of the stream.\n * @param contractVersion\n * @returns The contract content as a Uint8Array.\n */\nasync function getContract(streamType: StreamType, contractVersion?: number): Promise<CompiledKuneiform> {\n switch (streamType) {\n case StreamType.Composed:\n return contractVersion === 2 ? composedStreamTemplateUnix : composedStreamTemplate;\n case StreamType.Primitive:\n return contractVersion === 2 ? primitiveStreamTemplateUnix : primitiveStreamTemplate;\n default:\n throw new Error(`Unknown stream type: ${streamType}`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAA2B;AAI3B,8BAKO;AAuBP,eAAsB,aACpB,OACqC;AACrC,MAAI;AACF,UAAM,SAAS,MAAM,YAAY,MAAM,YAAY,MAAM,eAAe;AAExE,WAAO,OAAO,MAAM,SAAS,MAAM;AAEnC,UAAM,SAAS,MAAM,MAAM,WAAW;AAAA,MACpC;AAAA,QACE;AAAA,QACA,aAAa,sBAAsB,MAAM,UAAU,YAAY,MAAM,SAAS,MAAM,CAAC;AAAA,MACvF;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,4BAA4B,KAAK,EAAE;AAAA,EACrD;AACF;AAQA,eAAe,YAAY,YAAwB,iBAAsD;AACvG,UAAQ,YAAY;AAAA,IAClB,KAAK,iCAAW;AACd,aAAO,oBAAoB,IAAI,qDAA6B;AAAA,IAC9D,KAAK,iCAAW;AACd,aAAO,oBAAoB,IAAI,sDAA8B;AAAA,IAC/D;AACE,YAAM,IAAI,MAAM,wBAAwB,UAAU,EAAE;AAAA,EACxD;AACF;",
6
- "names": []
4
+ "sourcesContent": ["import { StreamType } from \"./contractValues\";\nimport { TxReceipt } from \"@kwilteam/kwil-js/dist/core/tx\";\nimport { Kwil } from \"@kwilteam/kwil-js/dist/client/kwil\";\nimport { CompiledKuneiform } from \"@kwilteam/kwil-js/dist/core/payload\";\nimport {\n composedStreamTemplate,\n primitiveStreamTemplate,\n composedStreamTemplateUnix,\n primitiveStreamTemplateUnix\n} from \"../contracts/contractsContent\";\nimport { GenericResponse } from \"@kwilteam/kwil-js/dist/core/resreq\";\nimport { KwilSigner } from \"@kwilteam/kwil-js\";\nimport { StreamId } from \"../util/StreamId\";\nimport pg from \"pg\";\nconst { Pool } = pg;\n\nexport interface DeployStreamInput {\n streamId: StreamId;\n streamType: StreamType;\n kwilClient: Kwil<any>;\n kwilSigner: KwilSigner;\n synchronous?: boolean;\n contractVersion?: number;\n neonConnectionString?: string;\n}\n\nexport interface DeployStreamOutput {\n receipt: TxReceipt;\n}\n\n/**\n * Deploys a stream to TN.\n * @param input - The input parameters for deploying the stream.\n * @returns The transaction hash of the deployment.\n */\nexport async function deployStream(\n input: DeployStreamInput,\n): Promise<GenericResponse<TxReceipt>> {\n try {\n const schema = await getContract(input.streamType, input.contractVersion);\n\n schema.name = input.streamId.getId();\n\n const txHash = await input.kwilClient.deploy(\n {\n schema,\n description: `TN SDK - Deploying ${input.streamType} stream: ${input.streamId.getId()}`,\n },\n input.kwilSigner,\n input.synchronous,\n );\n\n // Optional: insert into Postgres via neon connection\n if (input.neonConnectionString) {\n console.log(\"Neon connection detected, attempting to insert into DB...\");\n\n const signer: any = input.kwilSigner.signer;\n const dataProvider = signer.address.toLowerCase().substring(2);\n\n const pool = new Pool({ connectionString: input.neonConnectionString });\n await pool.query(\n `INSERT INTO streams (data_provider, stream_id, type, stream_name, display_name, categories, owner_wallet, geography, tags)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (data_provider, stream_id) DO NOTHING`,\n [dataProvider, input.streamId.getId(), input.streamType, input.streamId.getName(), input.streamId.getName(), '{External}', dataProvider, 'Global', '{External}'],\n );\n await pool.end();\n\n console.log(\"successfully inserted into Explorer DB\", input.streamId.getName());\n }\n\n return txHash;\n } catch (error) {\n throw new Error(`Failed to deploy stream: ${error}`);\n }\n}\n\n/**\n * Returns the contract content based on the stream type.\n * @param streamType - The type of the stream.\n * @param contractVersion\n * @returns The contract content as a Uint8Array.\n */\nasync function getContract(streamType: StreamType, contractVersion?: number): Promise<CompiledKuneiform> {\n switch (streamType) {\n case StreamType.Composed:\n return contractVersion === 2 ? composedStreamTemplateUnix : composedStreamTemplate;\n case StreamType.Primitive:\n return contractVersion === 2 ? primitiveStreamTemplateUnix : primitiveStreamTemplate;\n default:\n throw new Error(`Unknown stream type: ${streamType}`);\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAA2B;AAI3B,8BAKO;AAIP,gBAAe;AACf,IAAM,EAAE,KAAK,IAAI,UAAAA;AAqBjB,eAAsB,aACpB,OACqC;AACrC,MAAI;AACF,UAAM,SAAS,MAAM,YAAY,MAAM,YAAY,MAAM,eAAe;AAExE,WAAO,OAAO,MAAM,SAAS,MAAM;AAEnC,UAAM,SAAS,MAAM,MAAM,WAAW;AAAA,MACpC;AAAA,QACE;AAAA,QACA,aAAa,sBAAsB,MAAM,UAAU,YAAY,MAAM,SAAS,MAAM,CAAC;AAAA,MACvF;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAGA,QAAI,MAAM,sBAAsB;AAC9B,cAAQ,IAAI,2DAA2D;AAEvE,YAAM,SAAc,MAAM,WAAW;AACrC,YAAM,eAAe,OAAO,QAAQ,YAAY,EAAE,UAAU,CAAC;AAE7D,YAAM,OAAO,IAAI,KAAK,EAAE,kBAAkB,MAAM,qBAAqB,CAAC;AACtE,YAAM,KAAK;AAAA,QACP;AAAA;AAAA;AAAA,QAGA,CAAC,cAAc,MAAM,SAAS,MAAM,GAAG,MAAM,YAAY,MAAM,SAAS,QAAQ,GAAG,MAAM,SAAS,QAAQ,GAAG,cAAc,cAAc,UAAU,YAAY;AAAA,MACnK;AACA,YAAM,KAAK,IAAI;AAEf,cAAQ,IAAI,0CAA0C,MAAM,SAAS,QAAQ,CAAC;AAAA,IAChF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,4BAA4B,KAAK,EAAE;AAAA,EACrD;AACF;AAQA,eAAe,YAAY,YAAwB,iBAAsD;AACvG,UAAQ,YAAY;AAAA,IAClB,KAAK,iCAAW;AACd,aAAO,oBAAoB,IAAI,qDAA6B;AAAA,IAC9D,KAAK,iCAAW;AACd,aAAO,oBAAoB,IAAI,sDAA8B;AAAA,IAC/D;AACE,YAAM,IAAI,MAAM,wBAAwB,UAAU,EAAE;AAAA,EACxD;AACF;",
6
+ "names": ["pg"]
7
7
  }
@@ -400,5 +400,28 @@ var Stream = class {
400
400
  }))
401
401
  ).throw();
402
402
  }
403
+ /**
404
+ * A custom method that accepts the procedure name and custom input of type Record<string, any>
405
+ * Returns the result of the procedure in the same format as StreamRecord
406
+ * I.e. a custom procedure named "get_custom_index" that returns a list of date_value and value
407
+ * can be called with customProcedureWithArgs("get_custom_index", { $customArg1: "value1", $customArg2: "value2" })
408
+ * where $customArg1 and $customArg2 are the arguments of the procedure
409
+ * @param procedure
410
+ * @param args
411
+ */
412
+ async customProcedureWithArgs(procedure, args) {
413
+ const result = await this.call(
414
+ procedure,
415
+ [
416
+ import_action.ActionInput.fromObject(args)
417
+ ]
418
+ );
419
+ return result.mapRight(
420
+ (result2) => result2.map((row) => ({
421
+ dateValue: row.date_value,
422
+ value: row.value
423
+ }))
424
+ ).throw();
425
+ }
403
426
  };
404
427
  //# sourceMappingURL=stream.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contracts-api/stream.ts"],
4
- "sourcesContent": ["import { KwilSigner, NodeKwil, WebKwil } from \"@kwilteam/kwil-js\";\nimport { ActionInput } from \"@kwilteam/kwil-js/dist/core/action\";\nimport { Database } from \"@kwilteam/kwil-js/dist/core/database\";\nimport { GenericResponse } from \"@kwilteam/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@kwilteam/kwil-js/dist/core/tx\";\nimport { generateDBID } from \"@kwilteam/kwil-js/dist/utils/dbid\";\nimport { Either } from \"monads-io\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { head } from \"../util/head\";\nimport { StreamId } from \"../util/StreamId\";\nimport { toVisibilityEnum, VisibilityEnum } from \"../util/visibility\";\nimport {\n MetadataKey,\n MetadataKeyValueMap,\n MetadataTableKey,\n MetadataValueTypeForKey,\n StreamType,\n} from \"./contractValues\";\n\nexport interface GetRecordInput {\n dateFrom?: DateString | number;\n dateTo?: DateString | number;\n frozenAt?: number;\n baseDate?: DateString | number;\n}\n\nexport interface GetFirstRecordInput {\n afterDate?: DateString | number;\n frozenAt?: DateString | number;\n}\n\nexport interface StreamRecord {\n dateValue: DateString | number;\n value: string;\n}\n\nexport interface GetIndexChangeInput extends GetRecordInput {\n daysInterval: number;\n}\n\nexport class Stream {\n protected kwilClient: WebKwil | NodeKwil;\n protected kwilSigner: KwilSigner;\n protected locator: StreamLocator;\n protected dbid: string;\n protected schema?: Database;\n protected deployed: boolean = false;\n protected initialized: boolean = false;\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n locator: StreamLocator,\n ) {\n this.kwilClient = kwilClient;\n this.kwilSigner = kwilSigner;\n this.locator = locator;\n this.dbid = generateDBID(\n locator.dataProvider.getAddress(),\n locator.streamId.getId(),\n );\n }\n\n /**\n * Loads the schema for this stream from the network.\n * Throws if the stream is not deployed.\n */\n public async loadSchema(): Promise<void> {\n const response = await this.kwilClient.getSchema(this.dbid);\n if (response.status !== 200 || !response.data) {\n throw new Error(\n `Failed to load schema for stream ${this.locator.streamId.getId()}`,\n );\n }\n this.schema = response.data;\n }\n\n /**\n * Executes a method on the stream\n */\n protected async execute(\n method: string,\n inputs: ActionInput[],\n ): Promise<GenericResponse<TxReceipt>> {\n return this.kwilClient.execute(\n {\n dbid: this.dbid,\n name: method,\n inputs,\n description: `TN SDK - Executing method on stream: ${method}`,\n },\n this.kwilSigner,\n );\n }\n\n /**\n * Executes a method on the stream after checking if it's initialized\n */\n protected async checkedExecute(\n method: string,\n inputs: ActionInput[],\n ): Promise<GenericResponse<TxReceipt>> {\n await this.checkInitialized();\n return this.execute(method, inputs);\n }\n\n /**\n * Calls a method on the stream\n */\n protected async call<T>(\n method: string,\n inputs: ActionInput[],\n ): Promise<Either<number, T>> {\n const result = await this.kwilClient.call(\n {\n dbid: this.dbid,\n name: method,\n inputs,\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n return Either.left(result.status);\n }\n\n return Either.right(result.data?.result as T);\n }\n\n /**\n * Checks if the stream is initialized\n */\n protected async checkInitialized(expectedType?: StreamType): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.checkDeployed();\n\n // check if is initialized by trying to get its type\n const type = await this.getType();\n\n // check if type is valid\n const expectedTypes = expectedType\n ? [expectedType]\n : [StreamType.Primitive, StreamType.Composed];\n if (!expectedTypes.includes(type)) {\n throw new Error(`Invalid stream type: ${type}`);\n }\n\n this.initialized = true;\n }\n\n /**\n * Checks if the stream is deployed\n */\n protected async checkDeployed(): Promise<void> {\n if (this.deployed) {\n return;\n }\n await this.loadSchema();\n this.deployed = true;\n }\n\n /**\n * Initializes the stream\n */\n public async initializeStream(): Promise<GenericResponse<TxReceipt>> {\n // shouldn't use checkedExecute, because it's not initialized yet\n return this.execute(\"init\", []);\n }\n\n /**\n * Returns the records of the stream within the given date range\n */\n public async getRecord(input: GetRecordInput): Promise<StreamRecord[]> {\n // TODO: change value to string when kwil-js is updated\n const result = await this.call<{ date_value: string; value: string }[]>(\n \"get_record\",\n [\n ActionInput.fromObject({\n $date_from: input.dateFrom,\n $date_to: input.dateTo,\n $frozen_at: input.frozenAt,\n $base_date: input.baseDate,\n }),\n ],\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * Returns the index of the stream within the given date range\n */\n public async getIndex(input: GetRecordInput): Promise<StreamRecord[]> {\n const result = await this.call<{ date_value: string; value: string }[]>(\n \"get_index\",\n [\n ActionInput.fromObject({\n $date_from: input.dateFrom,\n $date_to: input.dateTo,\n $frozen_at: input.frozenAt,\n $base_date: input.baseDate,\n }),\n ],\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * Returns the type of the stream\n */\n public async getType(): Promise<StreamType> {\n const result = await this.getMetadata(MetadataKey.TypeKey, true);\n\n if (!result) {\n throw new Error(\"Failed to get stream type\");\n }\n\n const type = head(result).unwrapOrElse(() => {\n throw new Error(\n \"Failed to get stream type. Check if the stream is initialized.\",\n );\n });\n\n const validTypes = [StreamType.Primitive, StreamType.Composed];\n\n if (!validTypes.includes(type.value as StreamType)) {\n throw new Error(`Invalid stream type: ${type.value}`);\n }\n\n return type.value as StreamType;\n }\n\n /**\n * Returns the first record of the stream\n */\n public async getFirstRecord(\n input: GetFirstRecordInput,\n ): Promise<StreamRecord | null> {\n const result = await this.call<{ date_value: string; value: string }[]>(\n \"get_first_record\",\n [\n ActionInput.fromObject({\n $after_date: input.afterDate,\n $frozen_at: input.frozenAt,\n }),\n ],\n );\n\n return result\n .mapRight(head)\n .mapRight((result) =>\n result\n .map((result) => ({\n dateValue: result.date_value,\n value: result.value,\n }))\n .unwrapOr(null),\n )\n .throw();\n }\n\n protected async setMetadata<K extends MetadataKey>(\n key: K,\n value: MetadataValueTypeForKey<K>,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.execute(\"insert_metadata\", [\n ActionInput.fromObject({\n $key: key,\n $value: value,\n $val_type: MetadataKeyValueMap[key],\n }),\n ]);\n }\n\n protected async getMetadata<K extends MetadataKey>(\n key: K,\n onlyLatest: boolean = true,\n filteredRef?: string,\n ): Promise<\n { rowId: string; value: MetadataValueTypeForKey<K>; createdAt: number }[]\n > {\n const result = await this.call<\n {\n row_id: string;\n value_i: number;\n value_f: string;\n value_b: boolean;\n value_s: string;\n value_ref: string;\n created_at: number;\n }[]\n >(\"get_metadata\", [\n ActionInput.fromObject({\n $key: key,\n $only_latest: onlyLatest,\n $ref: filteredRef,\n }),\n ]);\n return result\n .mapRight((result) =>\n result.map((row) => ({\n rowId: row.row_id,\n value: row[\n MetadataTableKey[MetadataKeyValueMap[key as MetadataKey]]\n ] as MetadataValueTypeForKey<K>,\n createdAt: row.created_at,\n })),\n )\n .throw();\n }\n\n /**\n * Sets the read visibility of the stream\n */\n public async setReadVisibility(\n visibility: VisibilityEnum,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.setMetadata(\n MetadataKey.ReadVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the read visibility of the stream\n */\n public async getReadVisibility(): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(MetadataKey.ReadVisibilityKey, true);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Sets the compose visibility of the stream\n */\n public async setComposeVisibility(\n visibility: VisibilityEnum,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.setMetadata(\n MetadataKey.ComposeVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the compose visibility of the stream\n */\n public async getComposeVisibility(): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n MetadataKey.ComposeVisibilityKey,\n true,\n );\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Allows a wallet to read the stream\n */\n public async allowReadWallet(\n wallet: EthereumAddress,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.setMetadata(\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n }\n\n /**\n * Disables a wallet from reading the stream\n */\n public async disableReadWallet(\n wallet: EthereumAddress,\n ): Promise<GenericResponse<TxReceipt>> {\n const result = await this.getMetadata(\n MetadataKey.AllowReadWalletKey,\n true,\n wallet.getAddress(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Wallet not found in allowed list\");\n }\n\n return await this.disableMetadata(row_id);\n }\n\n /**\n * Allows a stream to use this stream as child\n */\n public async allowComposeStream(\n locator: StreamLocator,\n ): Promise<GenericResponse<TxReceipt>> {\n const streamDbId = generateDBID(\n locator.dataProvider.getAddress(),\n locator.streamId.getId(),\n );\n return await this.setMetadata(\n MetadataKey.AllowComposeStreamKey,\n streamDbId,\n );\n }\n\n /**\n * Disables a stream from using this stream as child\n */\n public async disableComposeStream(\n locator: StreamLocator,\n ): Promise<GenericResponse<TxReceipt>> {\n const result = await this.getMetadata(\n MetadataKey.AllowComposeStreamKey,\n true,\n locator.toString(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Stream not found in allowed list\");\n }\n\n return await this.disableMetadata(row_id);\n }\n\n protected async disableMetadata(\n rowId: string,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.execute(\"disable_metadata\", [\n ActionInput.fromObject({\n $row_id: rowId,\n }),\n ]);\n }\n\n /**\n * Returns the wallets allowed to read the stream\n */\n public async getAllowedReadWallets(): Promise<EthereumAddress[]> {\n const result = await this.getMetadata(MetadataKey.AllowReadWalletKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => new EthereumAddress(row.value));\n }\n\n /**\n * Returns the streams allowed to compose the stream\n */\n public async getAllowedComposeStreams(): Promise<StreamLocator[]> {\n const result = await this.getMetadata(MetadataKey.AllowComposeStreamKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => {\n const [streamId, dataProvider] = row.value.split(\":\");\n return {\n streamId: StreamId.fromString(streamId).throw(),\n dataProvider: new EthereumAddress(dataProvider),\n };\n });\n }\n\n /**\n * Returns the index change of the stream within the given date range\n */\n public async getIndexChange(\n input: GetIndexChangeInput,\n ): Promise<StreamRecord[]> {\n const result = await this.call<{ date_value: string; value: string }[]>(\n \"get_index_change\",\n [\n ActionInput.fromObject({\n $date_from: input.dateFrom,\n $date_to: input.dateTo,\n $frozen_at: input.frozenAt,\n $base_date: input.baseDate,\n $days_interval: input.daysInterval,\n }),\n ],\n );\n\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * A custom method that accepts the procedure name and the input of GetRecordInput\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_price\" that returns a list of date_value and value\n * can be called with customGetProcedure(\"get_price\", { dateFrom: \"2021-01-01\", dateTo: \"2021-01-31\" })\n */\n public async customGetProcedure(\n procedure: string,\n input: GetRecordInput,\n ): Promise<StreamRecord[]> {\n const result = await this.call<{ date_value: string; value: string }[]>(\n procedure,\n [\n ActionInput.fromObject({\n $date_from: input.dateFrom,\n $date_to: input.dateTo,\n $frozen_at: input.frozenAt,\n $base_date: input.baseDate,\n }),\n ],\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { KwilSigner, NodeKwil, WebKwil } from \"@kwilteam/kwil-js\";\nimport { ActionInput } from \"@kwilteam/kwil-js/dist/core/action\";\nimport { Database } from \"@kwilteam/kwil-js/dist/core/database\";\nimport { GenericResponse } from \"@kwilteam/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@kwilteam/kwil-js/dist/core/tx\";\nimport { generateDBID } from \"@kwilteam/kwil-js/dist/utils/dbid\";\nimport { Either } from \"monads-io\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { head } from \"../util/head\";\nimport { StreamId } from \"../util/StreamId\";\nimport { toVisibilityEnum, VisibilityEnum } from \"../util/visibility\";\nimport {\n MetadataKey,\n MetadataKeyValueMap,\n MetadataTableKey,\n MetadataValueTypeForKey,\n StreamType,\n} from \"./contractValues\";\n\nexport interface GetRecordInput {\n dateFrom?: DateString | number;\n dateTo?: DateString | number;\n frozenAt?: number;\n baseDate?: DateString | number;\n}\n\nexport interface GetFirstRecordInput {\n afterDate?: DateString | number;\n frozenAt?: DateString | number;\n}\n\nexport interface StreamRecord {\n dateValue: DateString | number;\n value: string;\n}\n\nexport interface GetIndexChangeInput extends GetRecordInput {\n daysInterval: number;\n}\n\nexport class Stream {\n protected kwilClient: WebKwil | NodeKwil;\n protected kwilSigner: KwilSigner;\n protected locator: StreamLocator;\n protected dbid: string;\n protected schema?: Database;\n protected deployed: boolean = false;\n protected initialized: boolean = false;\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n locator: StreamLocator,\n ) {\n this.kwilClient = kwilClient;\n this.kwilSigner = kwilSigner;\n this.locator = locator;\n this.dbid = generateDBID(\n locator.dataProvider.getAddress(),\n locator.streamId.getId(),\n );\n }\n\n /**\n * Loads the schema for this stream from the network.\n * Throws if the stream is not deployed.\n */\n public async loadSchema(): Promise<void> {\n const response = await this.kwilClient.getSchema(this.dbid);\n if (response.status !== 200 || !response.data) {\n throw new Error(\n `Failed to load schema for stream ${this.locator.streamId.getId()}`,\n );\n }\n this.schema = response.data;\n }\n\n /**\n * Executes a method on the stream\n */\n protected async execute(\n method: string,\n inputs: ActionInput[],\n ): Promise<GenericResponse<TxReceipt>> {\n return this.kwilClient.execute(\n {\n dbid: this.dbid,\n name: method,\n inputs,\n description: `TN SDK - Executing method on stream: ${method}`,\n },\n this.kwilSigner,\n );\n }\n\n /**\n * Executes a method on the stream after checking if it's initialized\n */\n protected async checkedExecute(\n method: string,\n inputs: ActionInput[],\n ): Promise<GenericResponse<TxReceipt>> {\n await this.checkInitialized();\n return this.execute(method, inputs);\n }\n\n /**\n * Calls a method on the stream\n */\n protected async call<T>(\n method: string,\n inputs: ActionInput[],\n ): Promise<Either<number, T>> {\n const result = await this.kwilClient.call(\n {\n dbid: this.dbid,\n name: method,\n inputs,\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n return Either.left(result.status);\n }\n\n return Either.right(result.data?.result as T);\n }\n\n /**\n * Checks if the stream is initialized\n */\n protected async checkInitialized(expectedType?: StreamType): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.checkDeployed();\n\n // check if is initialized by trying to get its type\n const type = await this.getType();\n\n // check if type is valid\n const expectedTypes = expectedType\n ? [expectedType]\n : [StreamType.Primitive, StreamType.Composed];\n if (!expectedTypes.includes(type)) {\n throw new Error(`Invalid stream type: ${type}`);\n }\n\n this.initialized = true;\n }\n\n /**\n * Checks if the stream is deployed\n */\n protected async checkDeployed(): Promise<void> {\n if (this.deployed) {\n return;\n }\n await this.loadSchema();\n this.deployed = true;\n }\n\n /**\n * Initializes the stream\n */\n public async initializeStream(): Promise<GenericResponse<TxReceipt>> {\n // shouldn't use checkedExecute, because it's not initialized yet\n return this.execute(\"init\", []);\n }\n\n /**\n * Returns the records of the stream within the given date range\n */\n public async getRecord(input: GetRecordInput): Promise<StreamRecord[]> {\n // TODO: change value to string when kwil-js is updated\n const result = await this.call<{ date_value: string; value: string }[]>(\n \"get_record\",\n [\n ActionInput.fromObject({\n $date_from: input.dateFrom,\n $date_to: input.dateTo,\n $frozen_at: input.frozenAt,\n $base_date: input.baseDate,\n }),\n ],\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * Returns the index of the stream within the given date range\n */\n public async getIndex(input: GetRecordInput): Promise<StreamRecord[]> {\n const result = await this.call<{ date_value: string; value: string }[]>(\n \"get_index\",\n [\n ActionInput.fromObject({\n $date_from: input.dateFrom,\n $date_to: input.dateTo,\n $frozen_at: input.frozenAt,\n $base_date: input.baseDate,\n }),\n ],\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * Returns the type of the stream\n */\n public async getType(): Promise<StreamType> {\n const result = await this.getMetadata(MetadataKey.TypeKey, true);\n\n if (!result) {\n throw new Error(\"Failed to get stream type\");\n }\n\n const type = head(result).unwrapOrElse(() => {\n throw new Error(\n \"Failed to get stream type. Check if the stream is initialized.\",\n );\n });\n\n const validTypes = [StreamType.Primitive, StreamType.Composed];\n\n if (!validTypes.includes(type.value as StreamType)) {\n throw new Error(`Invalid stream type: ${type.value}`);\n }\n\n return type.value as StreamType;\n }\n\n /**\n * Returns the first record of the stream\n */\n public async getFirstRecord(\n input: GetFirstRecordInput,\n ): Promise<StreamRecord | null> {\n const result = await this.call<{ date_value: string; value: string }[]>(\n \"get_first_record\",\n [\n ActionInput.fromObject({\n $after_date: input.afterDate,\n $frozen_at: input.frozenAt,\n }),\n ],\n );\n\n return result\n .mapRight(head)\n .mapRight((result) =>\n result\n .map((result) => ({\n dateValue: result.date_value,\n value: result.value,\n }))\n .unwrapOr(null),\n )\n .throw();\n }\n\n protected async setMetadata<K extends MetadataKey>(\n key: K,\n value: MetadataValueTypeForKey<K>,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.execute(\"insert_metadata\", [\n ActionInput.fromObject({\n $key: key,\n $value: value,\n $val_type: MetadataKeyValueMap[key],\n }),\n ]);\n }\n\n protected async getMetadata<K extends MetadataKey>(\n key: K,\n onlyLatest: boolean = true,\n filteredRef?: string,\n ): Promise<\n { rowId: string; value: MetadataValueTypeForKey<K>; createdAt: number }[]\n > {\n const result = await this.call<\n {\n row_id: string;\n value_i: number;\n value_f: string;\n value_b: boolean;\n value_s: string;\n value_ref: string;\n created_at: number;\n }[]\n >(\"get_metadata\", [\n ActionInput.fromObject({\n $key: key,\n $only_latest: onlyLatest,\n $ref: filteredRef,\n }),\n ]);\n return result\n .mapRight((result) =>\n result.map((row) => ({\n rowId: row.row_id,\n value: row[\n MetadataTableKey[MetadataKeyValueMap[key as MetadataKey]]\n ] as MetadataValueTypeForKey<K>,\n createdAt: row.created_at,\n })),\n )\n .throw();\n }\n\n /**\n * Sets the read visibility of the stream\n */\n public async setReadVisibility(\n visibility: VisibilityEnum,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.setMetadata(\n MetadataKey.ReadVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the read visibility of the stream\n */\n public async getReadVisibility(): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(MetadataKey.ReadVisibilityKey, true);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Sets the compose visibility of the stream\n */\n public async setComposeVisibility(\n visibility: VisibilityEnum,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.setMetadata(\n MetadataKey.ComposeVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the compose visibility of the stream\n */\n public async getComposeVisibility(): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n MetadataKey.ComposeVisibilityKey,\n true,\n );\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Allows a wallet to read the stream\n */\n public async allowReadWallet(\n wallet: EthereumAddress,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.setMetadata(\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n }\n\n /**\n * Disables a wallet from reading the stream\n */\n public async disableReadWallet(\n wallet: EthereumAddress,\n ): Promise<GenericResponse<TxReceipt>> {\n const result = await this.getMetadata(\n MetadataKey.AllowReadWalletKey,\n true,\n wallet.getAddress(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Wallet not found in allowed list\");\n }\n\n return await this.disableMetadata(row_id);\n }\n\n /**\n * Allows a stream to use this stream as child\n */\n public async allowComposeStream(\n locator: StreamLocator,\n ): Promise<GenericResponse<TxReceipt>> {\n const streamDbId = generateDBID(\n locator.dataProvider.getAddress(),\n locator.streamId.getId(),\n );\n return await this.setMetadata(\n MetadataKey.AllowComposeStreamKey,\n streamDbId,\n );\n }\n\n /**\n * Disables a stream from using this stream as child\n */\n public async disableComposeStream(\n locator: StreamLocator,\n ): Promise<GenericResponse<TxReceipt>> {\n const result = await this.getMetadata(\n MetadataKey.AllowComposeStreamKey,\n true,\n locator.toString(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Stream not found in allowed list\");\n }\n\n return await this.disableMetadata(row_id);\n }\n\n protected async disableMetadata(\n rowId: string,\n ): Promise<GenericResponse<TxReceipt>> {\n return await this.execute(\"disable_metadata\", [\n ActionInput.fromObject({\n $row_id: rowId,\n }),\n ]);\n }\n\n /**\n * Returns the wallets allowed to read the stream\n */\n public async getAllowedReadWallets(): Promise<EthereumAddress[]> {\n const result = await this.getMetadata(MetadataKey.AllowReadWalletKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => new EthereumAddress(row.value));\n }\n\n /**\n * Returns the streams allowed to compose the stream\n */\n public async getAllowedComposeStreams(): Promise<StreamLocator[]> {\n const result = await this.getMetadata(MetadataKey.AllowComposeStreamKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => {\n const [streamId, dataProvider] = row.value.split(\":\");\n return {\n streamId: StreamId.fromString(streamId).throw(),\n dataProvider: new EthereumAddress(dataProvider),\n };\n });\n }\n\n /**\n * Returns the index change of the stream within the given date range\n */\n public async getIndexChange(\n input: GetIndexChangeInput,\n ): Promise<StreamRecord[]> {\n const result = await this.call<{ date_value: string; value: string }[]>(\n \"get_index_change\",\n [\n ActionInput.fromObject({\n $date_from: input.dateFrom,\n $date_to: input.dateTo,\n $frozen_at: input.frozenAt,\n $base_date: input.baseDate,\n $days_interval: input.daysInterval,\n }),\n ],\n );\n\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * A custom method that accepts the procedure name and the input of GetRecordInput\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_price\" that returns a list of date_value and value\n * can be called with customGetProcedure(\"get_price\", { dateFrom: \"2021-01-01\", dateTo: \"2021-01-31\" })\n */\n public async customGetProcedure(\n procedure: string,\n input: GetRecordInput,\n ): Promise<StreamRecord[]> {\n const result = await this.call<{ date_value: string; value: string }[]>(\n procedure,\n [\n ActionInput.fromObject({\n $date_from: input.dateFrom,\n $date_to: input.dateTo,\n $frozen_at: input.frozenAt,\n $base_date: input.baseDate,\n }),\n ],\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n\n\n /**\n * A custom method that accepts the procedure name and custom input of type Record<string, any>\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_custom_index\" that returns a list of date_value and value\n * can be called with customProcedureWithArgs(\"get_custom_index\", { $customArg1: \"value1\", $customArg2: \"value2\" })\n * where $customArg1 and $customArg2 are the arguments of the procedure\n * @param procedure\n * @param args\n */\n public async customProcedureWithArgs(\n procedure: string,\n args: Record<string, any>,\n ){\n const result = await this.call<{ date_value: string; value: string }[]>(\n procedure,\n [\n ActionInput.fromObject(args),\n ],\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n dateValue: row.date_value,\n value: row.value,\n })),\n )\n .throw();\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA4B;AAI5B,kBAA6B;AAC7B,uBAAuB;AAGvB,6BAAgC;AAChC,kBAAqB;AACrB,sBAAyB;AACzB,wBAAiD;AACjD,4BAMO;AAuBA,IAAM,SAAN,MAAa;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAoB;AAAA,EACpB,cAAuB;AAAA,EACjC,YACE,YACA,YACA,SACA;AACA,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,SAAK,WAAO;AAAA,MACV,QAAQ,aAAa,WAAW;AAAA,MAChC,QAAQ,SAAS,MAAM;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,aAA4B;AACvC,UAAM,WAAW,MAAM,KAAK,WAAW,UAAU,KAAK,IAAI;AAC1D,QAAI,SAAS,WAAW,OAAO,CAAC,SAAS,MAAM;AAC7C,YAAM,IAAI;AAAA,QACR,oCAAoC,KAAK,QAAQ,SAAS,MAAM,CAAC;AAAA,MACnE;AAAA,IACF;AACA,SAAK,SAAS,SAAS;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,QACd,QACA,QACqC;AACrC,WAAO,KAAK,WAAW;AAAA,MACrB;AAAA,QACE,MAAM,KAAK;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,aAAa,wCAAwC,MAAM;AAAA,MAC7D;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,eACd,QACA,QACqC;AACrC,UAAM,KAAK,iBAAiB;AAC5B,WAAO,KAAK,QAAQ,QAAQ,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,KACd,QACA,QAC4B;AAC5B,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,MAAM,KAAK;AAAA,QACX,MAAM;AAAA,QACN;AAAA,MACF;AAAA,MACA,KAAK;AAAA,IACP;AAEA,QAAI,OAAO,WAAW,KAAK;AACzB,aAAO,wBAAO,KAAK,OAAO,MAAM;AAAA,IAClC;AAEA,WAAO,wBAAO,MAAM,OAAO,MAAM,MAAW;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,iBAAiB,cAA0C;AACzE,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,cAAc;AAGnB,UAAM,OAAO,MAAM,KAAK,QAAQ;AAGhC,UAAM,gBAAgB,eAClB,CAAC,YAAY,IACb,CAAC,iCAAW,WAAW,iCAAW,QAAQ;AAC9C,QAAI,CAAC,cAAc,SAAS,IAAI,GAAG;AACjC,YAAM,IAAI,MAAM,wBAAwB,IAAI,EAAE;AAAA,IAChD;AAEA,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,gBAA+B;AAC7C,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AACA,UAAM,KAAK,WAAW;AACtB,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAwD;AAEnE,WAAO,KAAK,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,UAAU,OAAgD;AAErE,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,0BAAY,WAAW;AAAA,UACrB,YAAY,MAAM;AAAA,UAClB,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,OAAO,IAAI;AAAA,MACb,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,SAAS,OAAgD;AACpE,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,0BAAY,WAAW;AAAA,UACrB,YAAY,MAAM;AAAA,UAClB,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,OAAO,IAAI;AAAA,MACb,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,UAA+B;AAC1C,UAAM,SAAS,MAAM,KAAK,YAAY,kCAAY,SAAS,IAAI;AAE/D,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,WAAO,kBAAK,MAAM,EAAE,aAAa,MAAM;AAC3C,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,aAAa,CAAC,iCAAW,WAAW,iCAAW,QAAQ;AAE7D,QAAI,CAAC,WAAW,SAAS,KAAK,KAAmB,GAAG;AAClD,YAAM,IAAI,MAAM,wBAAwB,KAAK,KAAK,EAAE;AAAA,IACtD;AAEA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eACX,OAC8B;AAC9B,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,0BAAY,WAAW;AAAA,UACrB,aAAa,MAAM;AAAA,UACnB,YAAY,MAAM;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,OACJ,SAAS,gBAAI,EACb;AAAA,MAAS,CAACA,YACTA,QACG,IAAI,CAACA,aAAY;AAAA,QAChB,WAAWA,QAAO;AAAA,QAClB,OAAOA,QAAO;AAAA,MAChB,EAAE,EACD,SAAS,IAAI;AAAA,IAClB,EACC,MAAM;AAAA,EACX;AAAA,EAEA,MAAgB,YACd,KACA,OACqC;AACrC,WAAO,MAAM,KAAK,QAAQ,mBAAmB;AAAA,MAC3C,0BAAY,WAAW;AAAA,QACrB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,0CAAoB,GAAG;AAAA,MACpC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAgB,YACd,KACA,aAAsB,MACtB,aAGA;AACA,UAAM,SAAS,MAAM,KAAK,KAUxB,gBAAgB;AAAA,MAChB,0BAAY,WAAW;AAAA,QACrB,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AACD,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,OAAO,IAAI;AAAA,QACX,OAAO,IACL,uCAAiB,0CAAoB,GAAkB,CAAC,CAC1D;AAAA,QACA,WAAW,IAAI;AAAA,MACjB,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBACX,YACqC;AACrC,WAAO,MAAM,KAAK;AAAA,MAChB,kCAAY;AAAA,MACZ,WAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAoD;AAC/D,UAAM,SAAS,MAAM,KAAK,YAAY,kCAAY,mBAAmB,IAAI;AAEzE,eAAO,kBAAK,MAAM,EACf,IAAI,CAAC,YAAQ,oCAAiB,IAAI,KAAK,CAAC,EACxC,SAAS,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,qBACX,YACqC;AACrC,WAAO,MAAM,KAAK;AAAA,MAChB,kCAAY;AAAA,MACZ,WAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,uBAAuD;AAClE,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,kCAAY;AAAA,MACZ;AAAA,IACF;AAEA,eAAO,kBAAK,MAAM,EACf,IAAI,CAAC,YAAQ,oCAAiB,IAAI,KAAK,CAAC,EACxC,SAAS,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,gBACX,QACqC;AACrC,WAAO,MAAM,KAAK;AAAA,MAChB,kCAAY;AAAA,MACZ,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBACX,QACqC;AACrC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,kCAAY;AAAA,MACZ;AAAA,MACA,OAAO,WAAW;AAAA,IACpB;AAEA,UAAM,aAAS,kBAAK,MAAM,EACvB,IAAI,CAAC,QAAQ,IAAI,KAAK,EACtB,SAAS,IAAI;AAEhB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,WAAO,MAAM,KAAK,gBAAgB,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBACX,SACqC;AACrC,UAAM,iBAAa;AAAA,MACjB,QAAQ,aAAa,WAAW;AAAA,MAChC,QAAQ,SAAS,MAAM;AAAA,IACzB;AACA,WAAO,MAAM,KAAK;AAAA,MAChB,kCAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,qBACX,SACqC;AACrC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,kCAAY;AAAA,MACZ;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB;AAEA,UAAM,aAAS,kBAAK,MAAM,EACvB,IAAI,CAAC,QAAQ,IAAI,KAAK,EACtB,SAAS,IAAI;AAEhB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,WAAO,MAAM,KAAK,gBAAgB,MAAM;AAAA,EAC1C;AAAA,EAEA,MAAgB,gBACd,OACqC;AACrC,WAAO,MAAM,KAAK,QAAQ,oBAAoB;AAAA,MAC5C,0BAAY,WAAW;AAAA,QACrB,SAAS;AAAA,MACX,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,wBAAoD;AAC/D,UAAM,SAAS,MAAM,KAAK,YAAY,kCAAY,kBAAkB;AAEpE,WAAO,OACJ,OAAO,CAAC,QAAQ,IAAI,KAAK,EACzB,IAAI,CAAC,QAAQ,IAAI,uCAAgB,IAAI,KAAK,CAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,2BAAqD;AAChE,UAAM,SAAS,MAAM,KAAK,YAAY,kCAAY,qBAAqB;AAEvE,WAAO,OACJ,OAAO,CAAC,QAAQ,IAAI,KAAK,EACzB,IAAI,CAAC,QAAQ;AACZ,YAAM,CAAC,UAAU,YAAY,IAAI,IAAI,MAAM,MAAM,GAAG;AACpD,aAAO;AAAA,QACL,UAAU,yBAAS,WAAW,QAAQ,EAAE,MAAM;AAAA,QAC9C,cAAc,IAAI,uCAAgB,YAAY;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eACX,OACyB;AACzB,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,0BAAY,WAAW;AAAA,UACrB,YAAY,MAAM;AAAA,UAClB,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM;AAAA,UAClB,gBAAgB,MAAM;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,OAAO,IAAI;AAAA,MACb,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,mBACX,WACA,OACyB;AACzB,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,0BAAY,WAAW;AAAA,UACrB,YAAY,MAAM;AAAA,UAClB,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,OAAO,IAAI;AAAA,MACb,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,wBACX,WACA,MACD;AACC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,0BAAY,WAAW,IAAI;AAAA,MAC7B;AAAA,IACF;AACA,WAAO,OACJ;AAAA,MAAS,CAACA,YACTA,QAAO,IAAI,CAAC,SAAS;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,OAAO,IAAI;AAAA,MACb,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AACF;",
6
6
  "names": ["result"]
7
7
  }
@@ -23,7 +23,7 @@ __export(EthereumAddress_exports, {
23
23
  EthereumAddress: () => EthereumAddress
24
24
  });
25
25
  module.exports = __toCommonJS(EthereumAddress_exports);
26
- var import_ethers = require("ethers");
26
+ var import_ethers = require("ethers.cjs");
27
27
  var import_either = require("monads-io/either");
28
28
  var import_meta = {};
29
29
  var EthereumAddress = class _EthereumAddress {
@@ -29,9 +29,11 @@ var import_meta = {};
29
29
  var StreamId = class _StreamId {
30
30
  id;
31
31
  correctlyCreated = false;
32
- constructor(id) {
32
+ name;
33
+ constructor(id, name) {
33
34
  this.id = id;
34
35
  this.correctlyCreated = true;
36
+ this.name = name;
35
37
  }
36
38
  getId() {
37
39
  if (!this.correctlyCreated) {
@@ -39,6 +41,9 @@ var StreamId = class _StreamId {
39
41
  }
40
42
  return this.id;
41
43
  }
44
+ getName() {
45
+ return this.name;
46
+ }
42
47
  validate() {
43
48
  return this.id.length === 32 && this.id.startsWith("st");
44
49
  }
@@ -54,7 +59,7 @@ var StreamId = class _StreamId {
54
59
  }
55
60
  const hash = await (0, import_crypto_hash.sha256)(s);
56
61
  const streamIdStr = "st" + hash.slice(0, 30);
57
- return new _StreamId(streamIdStr);
62
+ return new _StreamId(streamIdStr, s);
58
63
  }
59
64
  static fromString(s) {
60
65
  try {