@trufnetwork/sdk-js 0.2.4 → 0.2.8

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 (41) hide show
  1. package/README.md +56 -2
  2. package/dist/cjs/client/browserClient.cjs +6 -0
  3. package/dist/cjs/client/browserClient.cjs.map +2 -2
  4. package/dist/cjs/client/client.cjs +12 -2
  5. package/dist/cjs/client/client.cjs.map +2 -2
  6. package/dist/cjs/client/nodeClient.cjs +8 -0
  7. package/dist/cjs/client/nodeClient.cjs.map +2 -2
  8. package/dist/cjs/contracts-api/composedStream.cjs +38 -2
  9. package/dist/cjs/contracts-api/composedStream.cjs.map +2 -2
  10. package/dist/cjs/contracts-api/deployStream.cjs +13 -0
  11. package/dist/cjs/contracts-api/deployStream.cjs.map +2 -2
  12. package/dist/cjs/util/StreamId.cjs +7 -2
  13. package/dist/cjs/util/StreamId.cjs.map +2 -2
  14. package/dist/esm/client/browserClient.mjs +6 -0
  15. package/dist/esm/client/browserClient.mjs.map +2 -2
  16. package/dist/esm/client/client.mjs +12 -2
  17. package/dist/esm/client/client.mjs.map +2 -2
  18. package/dist/esm/client/nodeClient.mjs +15 -0
  19. package/dist/esm/client/nodeClient.mjs.map +2 -2
  20. package/dist/esm/contracts-api/composedStream.mjs +42 -2
  21. package/dist/esm/contracts-api/composedStream.mjs.map +2 -2
  22. package/dist/esm/contracts-api/deployStream.mjs +13 -0
  23. package/dist/esm/contracts-api/deployStream.mjs.map +2 -2
  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/browserClient.d.ts +2 -0
  28. package/dist/types/client/browserClient.d.ts.map +1 -1
  29. package/dist/types/client/client.d.ts +8 -0
  30. package/dist/types/client/client.d.ts.map +1 -1
  31. package/dist/types/client/listAllStreams.d.ts.map +1 -1
  32. package/dist/types/client/nodeClient.d.ts +2 -0
  33. package/dist/types/client/nodeClient.d.ts.map +1 -1
  34. package/dist/types/contracts-api/composedStream.d.ts +3 -1
  35. package/dist/types/contracts-api/composedStream.d.ts.map +1 -1
  36. package/dist/types/contracts-api/deployStream.d.ts +2 -0
  37. package/dist/types/contracts-api/deployStream.d.ts.map +1 -1
  38. package/dist/types/util/StreamId.d.ts +2 -0
  39. package/dist/types/util/StreamId.d.ts.map +1 -1
  40. package/dist/types/util/visibility.d.ts.map +1 -1
  41. package/package.json +16 -12
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
@@ -66,6 +66,18 @@ const data = await stream.getRecord({
66
66
  });
67
67
  ```
68
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
+
69
81
  For a complete working example:
70
82
  - Check our [TN SDK Demo Repository](https://github.com/truflation/tsn-sdk-demo)
71
83
  - Try the [Live Demo on CodeSandbox](https://codesandbox.io/p/devbox/m2r3tt?file=%2Fsrc%2Froutes%2F%2Bpage.svelte)
@@ -101,7 +113,49 @@ import { ... } from "npm:@trufnetwork/sdk-js"
101
113
 
102
114
  ### Deno Environment Permissions
103
115
 
104
- 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
+ ```
105
159
 
106
160
  ## Support
107
161
 
@@ -28,12 +28,18 @@ var import_kwil_js = require("@kwilteam/kwil-js");
28
28
  var import_client = require("./client.cjs");
29
29
  var BrowserTNClient = class extends import_client.BaseTNClient {
30
30
  constructor(options) {
31
+ if (options.neonConnectionString) {
32
+ console.warn("Neon connection string is not supported in browser environments. Database operations won't be performed.");
33
+ }
31
34
  super(options);
32
35
  this.kwilClient = new import_kwil_js.WebKwil({
33
36
  ...options,
34
37
  kwilProvider: options.endpoint
35
38
  });
36
39
  }
40
+ getPool() {
41
+ return void 0;
42
+ }
37
43
  };
38
44
  var browserClient_default = BrowserTNClient;
39
45
  //# sourceMappingURL=browserClient.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/browserClient.ts"],
4
- "sourcesContent": ["import { EnvironmentType } from \"@kwilteam/kwil-js/dist/core/enums\";\nimport { WebKwil } from \"@kwilteam/kwil-js\";\nimport { BaseTNClient, TNClientOptions } from \"./client\";\n\nexport class BrowserTNClient extends BaseTNClient<EnvironmentType.BROWSER> {\n constructor(options: TNClientOptions) {\n super(options);\n this.kwilClient = new WebKwil({\n ...options,\n kwilProvider: options.endpoint,\n });\n }\n}\n\nexport default BrowserTNClient;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAwB;AACxB,oBAA8C;AAEvC,IAAM,kBAAN,cAA8B,2BAAsC;AAAA,EACzE,YAAY,SAA0B;AACpC,UAAM,OAAO;AACb,SAAK,aAAa,IAAI,uBAAQ;AAAA,MAC5B,GAAG;AAAA,MACH,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF;AAEA,IAAO,wBAAQ;",
4
+ "sourcesContent": ["import { EnvironmentType } from \"@kwilteam/kwil-js/dist/core/enums\";\nimport { WebKwil } from \"@kwilteam/kwil-js\";\nimport { BaseTNClient, TNClientOptions } from \"./client\";\nimport { type Pool } from \"pg\";\n\nexport class BrowserTNClient extends BaseTNClient<EnvironmentType.BROWSER> {\n constructor(options: TNClientOptions) {\n if (options.neonConnectionString) {\n console.warn(\"Neon connection string is not supported in browser environments. Database operations won't be performed.\");\n }\n\n super(options);\n this.kwilClient = new WebKwil({\n ...options,\n kwilProvider: options.endpoint,\n });\n }\n\n protected getPool(): Pool | undefined {\n return undefined;\n }\n}\n\nexport default BrowserTNClient;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAwB;AACxB,oBAA8C;AAGvC,IAAM,kBAAN,cAA8B,2BAAsC;AAAA,EACzE,YAAY,SAA0B;AACpC,QAAI,QAAQ,sBAAsB;AAChC,cAAQ,KAAK,0GAA0G;AAAA,IACzH;AAEA,UAAM,OAAO;AACb,SAAK,aAAa,IAAI,uBAAQ;AAAA,MAC5B,GAAG;AAAA,MACH,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEU,UAA4B;AACpC,WAAO;AAAA,EACT;AACF;AAEA,IAAO,wBAAQ;",
6
6
  "names": []
7
7
  }
@@ -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
+ pool: this.getPool()
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.getPool()
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": "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",
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\";\nimport { type Pool } from \"pg\";\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 pool: this.getPool(),\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.getPool(),\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\n protected abstract getPool(): Pool | undefined;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -34,6 +34,14 @@ var NodeTNClient = class extends import_client.BaseTNClient {
34
34
  kwilProvider: options.endpoint
35
35
  });
36
36
  }
37
+ getPool() {
38
+ const pg = require("pg");
39
+ const { Pool } = pg;
40
+ if (this.neonConnectionString) {
41
+ return new Pool({ connectionString: this.neonConnectionString });
42
+ }
43
+ return void 0;
44
+ }
37
45
  };
38
46
  var nodeClient_default = NodeTNClient;
39
47
  //# sourceMappingURL=nodeClient.cjs.map
@@ -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 kwilProvider: options.endpoint,\n });\n }\n}\n\nexport default NodeTNClient;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAyB;AACzB,oBAA8C;AAEvC,IAAM,eAAN,cAA2B,2BAAmC;AAAA,EACnE,YAAY,SAA0B;AACpC,UAAM,OAAO;AACb,SAAK,aAAa,IAAI,wBAAS;AAAA,MAC7B,GAAG;AAAA,MACH,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF;AAEA,IAAO,qBAAQ;",
4
+ "sourcesContent": ["import { EnvironmentType } from \"@kwilteam/kwil-js/dist/core/enums\";\nimport { NodeKwil } from \"@kwilteam/kwil-js\";\nimport { BaseTNClient, TNClientOptions } from \"./client\";\nimport { type Pool } from \"pg\";\nexport class NodeTNClient extends BaseTNClient<EnvironmentType.NODE> {\n constructor(options: TNClientOptions) {\n super(options);\n this.kwilClient = new NodeKwil({\n ...options,\n kwilProvider: options.endpoint,\n });\n }\n\n protected getPool(): Pool | undefined {\n const pg = require(\"pg\");\n const { Pool } = pg;\n if (this.neonConnectionString) {\n return new Pool({ connectionString: this.neonConnectionString });\n }\n return undefined;\n }\n}\n\nexport default NodeTNClient;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAyB;AACzB,oBAA8C;AAEvC,IAAM,eAAN,cAA2B,2BAAmC;AAAA,EACnE,YAAY,SAA0B;AACpC,UAAM,OAAO;AACb,SAAK,aAAa,IAAI,wBAAS;AAAA,MAC7B,GAAG;AAAA,MACH,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEU,UAA4B;AACpC,UAAM,KAAK,QAAQ,IAAI;AACvB,UAAM,EAAE,KAAK,IAAI;AACjB,QAAI,KAAK,sBAAsB;AAC7B,aAAO,IAAI,KAAK,EAAE,kBAAkB,KAAK,qBAAqB,CAAC;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAO,qBAAQ;",
6
6
  "names": []
7
7
  }
@@ -31,8 +31,10 @@ var import_contractValues = require("./contractValues.cjs");
31
31
  var import_stream = require("./stream.cjs");
32
32
  var ErrorStreamNotComposed = "stream is not a composed stream";
33
33
  var ComposedStream = class _ComposedStream extends import_stream.Stream {
34
- constructor(kwilClient, kwilSigner, locator) {
34
+ pool;
35
+ constructor(kwilClient, kwilSigner, locator, pool) {
35
36
  super(kwilClient, kwilSigner, locator);
37
+ this.pool = pool;
36
38
  }
37
39
  /**
38
40
  * Checks if the stream is a valid composed stream.
@@ -112,7 +114,7 @@ var ComposedStream = class _ComposedStream extends import_stream.Stream {
112
114
  streamIds.push(item.childStream.streamId.getId());
113
115
  weights.push(item.weight.toString());
114
116
  }
115
- return this.checkedComposedExecute("set_taxonomy", [
117
+ const res = await this.checkedComposedExecute("set_taxonomy", [
116
118
  import_action.ActionInput.fromObject({
117
119
  $data_providers: dataProviders,
118
120
  $stream_ids: streamIds,
@@ -120,6 +122,40 @@ var ComposedStream = class _ComposedStream extends import_stream.Stream {
120
122
  $start_date: startDate
121
123
  })
122
124
  ]);
125
+ if (this.pool) {
126
+ const parentProvider = this.locator.dataProvider.getAddress().slice(2);
127
+ const parentStreamId = this.locator.streamId.getId();
128
+ const startDateText = String(startDate);
129
+ for (const item of taxonomy.taxonomyItems) {
130
+ const childProvider = item.childStream.dataProvider.getAddress().slice(2);
131
+ const childStreamId = item.childStream.streamId.getId();
132
+ const weight = item.weight;
133
+ await this.pool.query(
134
+ `INSERT INTO taxonomies
135
+ (parent_data_provider, parent_stream_id,
136
+ child_data_provider, child_stream_id,
137
+ weight, start_date)
138
+ VALUES ($1, $2, $3, $4, $5, $6)
139
+ ON CONFLICT ON CONSTRAINT unique_parent_child DO NOTHING`,
140
+ [
141
+ parentProvider,
142
+ parentStreamId,
143
+ childProvider,
144
+ childStreamId,
145
+ weight,
146
+ startDateText
147
+ ]
148
+ );
149
+ }
150
+ await this.pool.end();
151
+ console.log("Successfully inserted taxonomy into Explorer DB", {
152
+ parentStreamId,
153
+ childStreamId: streamIds,
154
+ weight: weights,
155
+ startDate
156
+ });
157
+ }
158
+ return res;
123
159
  }
124
160
  /**
125
161
  * 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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",
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 { type Pool } from \"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 pool: Pool | undefined;\n\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n locator: StreamLocator,\n pool?: Pool,\n ) {\n super(kwilClient, kwilSigner, locator);\n this.pool = pool;\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.pool) {\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 this.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 this.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 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": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA4B;AAK5B,6BAAgC;AAChC,sBAAyB;AACzB,4BAA2B;AAC3B,oBAAuB;AAGhB,IAAM,yBAAyB;AAmB/B,IAAM,iBAAN,MAAM,wBAAuB,qBAAO;AAAA,EAC/B;AAAA,EAEV,YACE,YACA,YACA,SACA,MACA;AACA,UAAM,YAAY,YAAY,OAAO;AACrC,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,2BAA0C;AAEtD,UAAM,KAAK,iBAAiB,iCAAW,QAAQ;AAG/C,UAAM,aAAa,MAAM,KAAK,QAAQ;AACtC,QAAI,eAAe,iCAAW,UAAU;AACtC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,uBACZ,QACA,QACqC;AACrC,UAAM,KAAK,yBAAyB;AACpC,WAAO,KAAK,QAAQ,QAAQ,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,mBACX,QACwB;AAUxB,UAAM,SAAS,MAAM,KAAK,KAAqB,uBAAuB;AAAA,MACpE,0BAAY,WAAW,EAAE,iBAAiB,OAAO,cAAc,CAAC;AAAA,IAClE,CAAC;AAED,WAAO,OACJ,SAAS,CAAC,YAAY;AACrB,YAAM,gBAAiD,QAAQ;AAAA,QAC7D,CAAC,KAAK,WAAW;AACf,gBAAM,eAAe,IAAI,IAAY,OAAO,UAAU,KAAK,CAAC;AAC5D,uBAAa,KAAK;AAAA,YAChB,aAAa;AAAA,cACX,UAAU,yBAAS,WAAW,OAAO,eAAe,EAAE,MAAM;AAAA,cAC5D,cAAc,uCAAgB;AAAA,gBAC5B,OAAO;AAAA,cACT,EAAE,MAAM;AAAA,YACV;AAAA,YACA,QAAQ,OAAO;AAAA,UACjB,CAAC;AACD,cAAI,IAAY,OAAO,YAAY,YAAY;AAC/C,iBAAO;AAAA,QACT;AAAA,QACA,oBAAI,IAAgC;AAAA,MACtC;AAEA,UAAI;AACJ,UAAI,QAAQ,SAAS,KAAK,QAAQ,CAAC,EAAE,YAAY;AAC/C,oBAAY,QAAQ,CAAC,EAAE;AAAA,MACzB;AAEA,aAAO,MAAM,KAAK,cAAc,QAAQ,CAAC,EAAE;AAAA,QACzC,CAAC,CAACA,YAAWC,cAAa,OAAO;AAAA,UAC/B,WAAAD;AAAA,UACA,eAAAC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,EACA,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,YACX,UACqC;AACrC,UAAM,gBAA0B,CAAC;AACjC,UAAM,YAAsB,CAAC;AAC7B,UAAM,UAAoB,CAAC;AAC3B,UAAM,YAAY,SAAS;AAE3B,eAAW,QAAQ,SAAS,eAAe;AACzC,YAAM,kBAAkB,KAAK,YAAY,aACtC,WAAW,EACX,MAAM,CAAC;AACV,oBAAc,KAAK,eAAe;AAClC,gBAAU,KAAK,KAAK,YAAY,SAAS,MAAM,CAAC;AAChD,cAAQ,KAAK,KAAK,OAAO,SAAS,CAAC;AAAA,IACrC;AAEA,UAAM,MAAM,MAAM,KAAK,uBAAuB,gBAAgB;AAAA,MAC5D,0BAAY,WAAW;AAAA,QACrB,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAGD,QAAI,KAAK,MAAM;AAEb,YAAM,iBAAiB,KAAK,QAAQ,aAAa,WAAW,EAAE,MAAM,CAAC;AACrE,YAAM,iBAAiB,KAAK,QAAQ,SAAS,MAAM;AACnD,YAAM,gBAAgB,OAAO,SAAS;AAEtC,iBAAW,QAAQ,SAAS,eAAe;AACzC,cAAM,gBAAgB,KAAK,YAAY,aAAa,WAAW,EAAE,MAAM,CAAC;AACxE,cAAM,gBAAgB,KAAK,YAAY,SAAS,MAAM;AACtD,cAAM,SAAS,KAAK;AAEpB,cAAM,KAAK,KAAK;AAAA,UACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMA;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACJ;AAAA,MACF;AAEA,YAAM,KAAK,KAAK,IAAI;AACpB,cAAQ,IAAI,mDAAmD;AAAA,QAC7D;AAAA,QACA,eAAe;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,WAAW,QAAgC;AACvD,WAAO,IAAI;AAAA,MACT,OAAO,YAAY;AAAA,MACnB,OAAO,YAAY;AAAA,MACnB,OAAO,SAAS;AAAA,IAClB;AAAA,EACF;AACF;",
6
6
  "names": ["startDate", "taxonomyItems"]
7
7
  }
@@ -37,6 +37,19 @@ async function deployStream(input) {
37
37
  input.kwilSigner,
38
38
  input.synchronous
39
39
  );
40
+ if (input.pool) {
41
+ console.log("Neon connection detected, attempting to insert into DB...");
42
+ const signer = input.kwilSigner.signer;
43
+ const dataProvider = signer.address.toLowerCase().substring(2);
44
+ await input.pool.query(
45
+ `INSERT INTO streams (data_provider, stream_id, type, stream_name, display_name, categories, owner_wallet, geography, tags)
46
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
47
+ ON CONFLICT (data_provider, stream_id) DO NOTHING`,
48
+ [dataProvider, input.streamId.getId(), input.streamType, input.streamId.getName(), input.streamId.getName(), "{External}", dataProvider, "Global", "{External}"]
49
+ );
50
+ await input.pool.end();
51
+ console.log("successfully inserted into Explorer DB", input.streamId.getName());
52
+ }
40
53
  return txHash;
41
54
  } catch (error) {
42
55
  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;",
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 { type Pool } from \"pg\";\nexport interface DeployStreamInput {\n streamId: StreamId;\n streamType: StreamType;\n kwilClient: Kwil<any>;\n kwilSigner: KwilSigner;\n synchronous?: boolean;\n contractVersion?: number;\n pool?: Pool;\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.pool) {\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 await input.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 input.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;AAwBP,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,MAAM;AACd,cAAQ,IAAI,2DAA2D;AAEvE,YAAM,SAAc,MAAM,WAAW;AACrC,YAAM,eAAe,OAAO,QAAQ,YAAY,EAAE,UAAU,CAAC;AAE7D,YAAM,MAAM,KAAK;AAAA,QACf;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,MACjK;AACA,YAAM,MAAM,KAAK,IAAI;AAErB,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
6
  "names": []
7
7
  }
@@ -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 {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/StreamId.ts"],
4
- "sourcesContent": ["import { sha256 } from \"crypto-hash\";\nimport { Either } from \"monads-io\";\n\nexport class StreamId {\n private readonly id: string;\n private readonly correctlyCreated: boolean = false;\n\n private constructor(id: string) {\n this.id = id;\n this.correctlyCreated = true;\n }\n\n public getId(): string {\n if (!this.correctlyCreated) {\n throw new Error(\"StreamId not correctly created\");\n }\n\n return this.id;\n }\n\n public validate(): boolean {\n return this.id.length === 32 && this.id.startsWith(\"st\");\n }\n\n public toJSON(): string {\n return this.getId();\n }\n\n public static fromJSON(json: string): StreamId {\n return new StreamId(json);\n }\n\n public static async generate(s: string): Promise<StreamId> {\n // If the string is already a valid StreamId, return it\n if (s.length === 32 && s.startsWith(\"st\")) {\n return new StreamId(s);\n }\n\n // Compute SHA-256 hash of the input string\n const hash = await sha256(s);\n\n // Take the first 30 characters of the hash and prepend \"st\"\n const streamIdStr = \"st\" + hash.slice(0, 30);\n\n return new StreamId(streamIdStr);\n }\n\n public static fromString(s: string): Either<Error, StreamId> {\n try {\n return Either.right(new StreamId(s));\n } catch (e) {\n return Either.left(e as Error);\n }\n }\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n describe(\"StreamId\", () => {\n it(\"should generate a valid StreamId\", async () => {\n const streamId = await StreamId.generate(\"cpi_india_1.1.01\");\n expect(streamId.validate()).toBe(true);\n expect(streamId.getId()).toBe(\"st39830c44932bc42a3bffef72310948\");\n });\n });\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAuB;AACvB,uBAAuB;AADvB;AAGO,IAAM,WAAN,MAAM,UAAS;AAAA,EACH;AAAA,EACA,mBAA4B;AAAA,EAErC,YAAY,IAAY;AAC9B,SAAK,KAAK;AACV,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEO,QAAgB;AACrB,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,WAAoB;AACzB,WAAO,KAAK,GAAG,WAAW,MAAM,KAAK,GAAG,WAAW,IAAI;AAAA,EACzD;AAAA,EAEO,SAAiB;AACtB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,OAAc,SAAS,MAAwB;AAC7C,WAAO,IAAI,UAAS,IAAI;AAAA,EAC1B;AAAA,EAEA,aAAoB,SAAS,GAA8B;AAEzD,QAAI,EAAE,WAAW,MAAM,EAAE,WAAW,IAAI,GAAG;AACzC,aAAO,IAAI,UAAS,CAAC;AAAA,IACvB;AAGA,UAAM,OAAO,UAAM,2BAAO,CAAC;AAG3B,UAAM,cAAc,OAAO,KAAK,MAAM,GAAG,EAAE;AAE3C,WAAO,IAAI,UAAS,WAAW;AAAA,EACjC;AAAA,EAEA,OAAc,WAAW,GAAoC;AAC3D,QAAI;AACF,aAAO,wBAAO,MAAM,IAAI,UAAS,CAAC,CAAC;AAAA,IACrC,SAAS,GAAG;AACV,aAAO,wBAAO,KAAK,CAAU;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,IAAI,YAAY,QAAQ;AACtB,QAAM,EAAE,UAAU,IAAI,OAAO,IAAI,YAAY;AAC7C,WAAS,YAAY,MAAM;AACzB,OAAG,oCAAoC,YAAY;AACjD,YAAM,WAAW,MAAM,SAAS,SAAS,kBAAkB;AAC3D,aAAO,SAAS,SAAS,CAAC,EAAE,KAAK,IAAI;AACrC,aAAO,SAAS,MAAM,CAAC,EAAE,KAAK,kCAAkC;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACH;",
4
+ "sourcesContent": ["import { sha256 } from \"crypto-hash\";\nimport { Either } from \"monads-io\";\n\nexport class StreamId {\n private readonly id: string;\n private readonly correctlyCreated: boolean = false;\n private readonly name?: string;\n\n private constructor(id: string, name?: string) {\n this.id = id;\n this.correctlyCreated = true;\n this.name = name;\n }\n\n public getId(): string {\n if (!this.correctlyCreated) {\n throw new Error(\"StreamId not correctly created\");\n }\n\n return this.id;\n }\n\n public getName(): string | undefined {\n return this.name;\n }\n\n public validate(): boolean {\n return this.id.length === 32 && this.id.startsWith(\"st\");\n }\n\n public toJSON(): string {\n return this.getId();\n }\n\n public static fromJSON(json: string): StreamId {\n return new StreamId(json);\n }\n\n public static async generate(s: string): Promise<StreamId> {\n // If the string is already a valid StreamId, return it\n if (s.length === 32 && s.startsWith(\"st\")) {\n return new StreamId(s);\n }\n\n // Compute SHA-256 hash of the input string\n const hash = await sha256(s);\n\n // Take the first 30 characters of the hash and prepend \"st\"\n const streamIdStr = \"st\" + hash.slice(0, 30);\n\n return new StreamId(streamIdStr, s);\n }\n\n public static fromString(s: string): Either<Error, StreamId> {\n try {\n return Either.right(new StreamId(s));\n } catch (e) {\n return Either.left(e as Error);\n }\n }\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n describe(\"StreamId\", () => {\n it(\"should generate a valid StreamId\", async () => {\n const streamId = await StreamId.generate(\"cpi_india_1.1.01\");\n expect(streamId.validate()).toBe(true);\n expect(streamId.getId()).toBe(\"st39830c44932bc42a3bffef72310948\");\n });\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAuB;AACvB,uBAAuB;AADvB;AAGO,IAAM,WAAN,MAAM,UAAS;AAAA,EACH;AAAA,EACA,mBAA4B;AAAA,EAC5B;AAAA,EAET,YAAY,IAAY,MAAe;AAC7C,SAAK,KAAK;AACV,SAAK,mBAAmB;AACxB,SAAK,OAAO;AAAA,EACd;AAAA,EAEO,QAAgB;AACrB,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAA8B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,WAAoB;AACzB,WAAO,KAAK,GAAG,WAAW,MAAM,KAAK,GAAG,WAAW,IAAI;AAAA,EACzD;AAAA,EAEO,SAAiB;AACtB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,OAAc,SAAS,MAAwB;AAC7C,WAAO,IAAI,UAAS,IAAI;AAAA,EAC1B;AAAA,EAEA,aAAoB,SAAS,GAA8B;AAEzD,QAAI,EAAE,WAAW,MAAM,EAAE,WAAW,IAAI,GAAG;AACzC,aAAO,IAAI,UAAS,CAAC;AAAA,IACvB;AAGA,UAAM,OAAO,UAAM,2BAAO,CAAC;AAG3B,UAAM,cAAc,OAAO,KAAK,MAAM,GAAG,EAAE;AAE3C,WAAO,IAAI,UAAS,aAAa,CAAC;AAAA,EACpC;AAAA,EAEA,OAAc,WAAW,GAAoC;AAC3D,QAAI;AACF,aAAO,wBAAO,MAAM,IAAI,UAAS,CAAC,CAAC;AAAA,IACrC,SAAS,GAAG;AACV,aAAO,wBAAO,KAAK,CAAU;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,IAAI,YAAY,QAAQ;AACtB,QAAM,EAAE,UAAU,IAAI,OAAO,IAAI,YAAY;AAC7C,WAAS,YAAY,MAAM;AACzB,OAAG,oCAAoC,YAAY;AACjD,YAAM,WAAW,MAAM,SAAS,SAAS,kBAAkB;AAC3D,aAAO,SAAS,SAAS,CAAC,EAAE,KAAK,IAAI;AACrC,aAAO,SAAS,MAAM,CAAC,EAAE,KAAK,kCAAkC;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -3,12 +3,18 @@ import { WebKwil } from "@kwilteam/kwil-js";
3
3
  import { BaseTNClient } from "./client.mjs";
4
4
  var BrowserTNClient = class extends BaseTNClient {
5
5
  constructor(options) {
6
+ if (options.neonConnectionString) {
7
+ console.warn("Neon connection string is not supported in browser environments. Database operations won't be performed.");
8
+ }
6
9
  super(options);
7
10
  this.kwilClient = new WebKwil({
8
11
  ...options,
9
12
  kwilProvider: options.endpoint
10
13
  });
11
14
  }
15
+ getPool() {
16
+ return void 0;
17
+ }
12
18
  };
13
19
  var browserClient_default = BrowserTNClient;
14
20
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/browserClient.ts"],
4
- "sourcesContent": ["import { EnvironmentType } from \"@kwilteam/kwil-js/dist/core/enums\";\nimport { WebKwil } from \"@kwilteam/kwil-js\";\nimport { BaseTNClient, TNClientOptions } from \"./client\";\n\nexport class BrowserTNClient extends BaseTNClient<EnvironmentType.BROWSER> {\n constructor(options: TNClientOptions) {\n super(options);\n this.kwilClient = new WebKwil({\n ...options,\n kwilProvider: options.endpoint,\n });\n }\n}\n\nexport default BrowserTNClient;\n"],
5
- "mappings": ";AACA,SAAS,eAAe;AACxB,SAAS,oBAAqC;AAEvC,IAAM,kBAAN,cAA8B,aAAsC;AAAA,EACzE,YAAY,SAA0B;AACpC,UAAM,OAAO;AACb,SAAK,aAAa,IAAI,QAAQ;AAAA,MAC5B,GAAG;AAAA,MACH,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF;AAEA,IAAO,wBAAQ;",
4
+ "sourcesContent": ["import { EnvironmentType } from \"@kwilteam/kwil-js/dist/core/enums\";\nimport { WebKwil } from \"@kwilteam/kwil-js\";\nimport { BaseTNClient, TNClientOptions } from \"./client\";\nimport { type Pool } from \"pg\";\n\nexport class BrowserTNClient extends BaseTNClient<EnvironmentType.BROWSER> {\n constructor(options: TNClientOptions) {\n if (options.neonConnectionString) {\n console.warn(\"Neon connection string is not supported in browser environments. Database operations won't be performed.\");\n }\n\n super(options);\n this.kwilClient = new WebKwil({\n ...options,\n kwilProvider: options.endpoint,\n });\n }\n\n protected getPool(): Pool | undefined {\n return undefined;\n }\n}\n\nexport default BrowserTNClient;\n"],
5
+ "mappings": ";AACA,SAAS,eAAe;AACxB,SAAS,oBAAqC;AAGvC,IAAM,kBAAN,cAA8B,aAAsC;AAAA,EACzE,YAAY,SAA0B;AACpC,QAAI,QAAQ,sBAAsB;AAChC,cAAQ,KAAK,0GAA0G;AAAA,IACzH;AAEA,UAAM,OAAO;AACb,SAAK,aAAa,IAAI,QAAQ;AAAA,MAC5B,GAAG;AAAA,MACH,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEU,UAA4B;AACpC,WAAO;AAAA,EACT;AACF;AAEA,IAAO,wBAAQ;",
6
6
  "names": []
7
7
  }
@@ -15,7 +15,9 @@ var BaseTNClient = class {
15
15
  constructor(options) {
16
16
  __publicField(this, "kwilClient");
17
17
  __publicField(this, "signerInfo");
18
+ __publicField(this, "neonConnectionString");
18
19
  this.signerInfo = options.signerInfo;
20
+ this.neonConnectionString = options.neonConnectionString;
19
21
  }
20
22
  /**
21
23
  * Waits for a transaction to be mined by TN.
@@ -76,6 +78,12 @@ var BaseTNClient = class {
76
78
  }
77
79
  return this.kwilClient;
78
80
  }
81
+ /**
82
+ * Returns the Neon connection string used by the client.
83
+ */
84
+ getNeonConnectionString() {
85
+ return this.neonConnectionString;
86
+ }
79
87
  /**
80
88
  * Deploys a new stream.
81
89
  * @param streamId - The ID of the stream to deploy.
@@ -91,7 +99,8 @@ var BaseTNClient = class {
91
99
  synchronous,
92
100
  kwilClient: this.getKwilClient(),
93
101
  kwilSigner: this.getKwilSigner(),
94
- contractVersion
102
+ contractVersion,
103
+ pool: this.getPool()
95
104
  });
96
105
  }
97
106
  /**
@@ -137,7 +146,8 @@ var BaseTNClient = class {
137
146
  return new ComposedStream(
138
147
  this.getKwilClient(),
139
148
  this.getKwilSigner(),
140
- stream
149
+ stream,
150
+ this.getPool()
141
151
  );
142
152
  }
143
153
  /**
@@ -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": "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",
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\";\nimport { type Pool } from \"pg\";\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 pool: this.getPool(),\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.getPool(),\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\n protected abstract getPool(): Pool | undefined;\n}\n"],
5
+ "mappings": ";;;;;AAAA,SAAS,QAAQ,kBAAqC;AAQtD,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,cAAc;AAGvB,SAAS,uBAAuB;AAEhC,SAAS,sBAAsB;AAexB,IAAe,eAAf,MAAuD;AAAA,EAKlD,YAAY,SAA0B;AAJhD,wBAAU;AACV,wBAAU;AACV,wBAAU;AAGR,SAAK,aAAa,QAAQ;AAC1B,SAAK,uBAAuB,QAAQ;AAAA,EACtC;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,EAKA,0BAA8C;AAC5C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aACJ,UACA,YACA,aACA,iBACqC;AACrC,WAAO,MAAM,aAAa;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,KAAK,cAAc;AAAA,MAC/B,YAAY,KAAK,cAAc;AAAA,MAC/B;AAAA,MACA,MAAM,KAAK,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cACJ,UACA,aACqC;AACrC,WAAO,MAAM,cAAc;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,gBAAgB,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,MACA,KAAK,QAAQ;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,gBAAgB,KAAK,WAAW,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,OAAmD;AACrE,WAAO,eAAe,KAAK,cAAc,GAAG,KAAK;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAoB,kBAAkB,UAAkB;AACtD,UAAM,aAAa,IAAI,OAAO;AAAA,MAC5B,cAAc;AAAA,IAChB,CAAC;AACD,UAAM,YAAY,MAAM,WAAW,iBAAiB,EAAE;AACtD,WAAO,UAAU,MAAM;AAAA,EACzB;AAIF;",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,10 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
1
8
  // src/client/nodeClient.ts
2
9
  import { NodeKwil } from "@kwilteam/kwil-js";
3
10
  import { BaseTNClient } from "./client.mjs";
@@ -9,6 +16,14 @@ var NodeTNClient = class extends BaseTNClient {
9
16
  kwilProvider: options.endpoint
10
17
  });
11
18
  }
19
+ getPool() {
20
+ const pg = __require("pg");
21
+ const { Pool } = pg;
22
+ if (this.neonConnectionString) {
23
+ return new Pool({ connectionString: this.neonConnectionString });
24
+ }
25
+ return void 0;
26
+ }
12
27
  };
13
28
  var nodeClient_default = NodeTNClient;
14
29
  export {