@nosana/scenario 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +106 -17
  2. package/dist/helpers/index.d.ts +3 -0
  3. package/dist/helpers/index.d.ts.map +1 -0
  4. package/dist/helpers/index.js +3 -0
  5. package/dist/helpers/index.js.map +1 -0
  6. package/dist/helpers/jobs/close-market.d.ts +3 -0
  7. package/dist/helpers/jobs/close-market.d.ts.map +1 -0
  8. package/dist/helpers/jobs/close-market.js +11 -0
  9. package/dist/helpers/jobs/close-market.js.map +1 -0
  10. package/dist/helpers/jobs/create-market.d.ts +3 -0
  11. package/dist/helpers/jobs/create-market.d.ts.map +1 -0
  12. package/dist/helpers/jobs/create-market.js +14 -0
  13. package/dist/helpers/jobs/create-market.js.map +1 -0
  14. package/dist/helpers/jobs/index.d.ts +6 -0
  15. package/dist/helpers/jobs/index.d.ts.map +1 -0
  16. package/dist/helpers/jobs/index.js +6 -0
  17. package/dist/helpers/jobs/index.js.map +1 -0
  18. package/dist/helpers/jobs/join-market-queue.d.ts +6 -0
  19. package/dist/helpers/jobs/join-market-queue.d.ts.map +1 -0
  20. package/dist/helpers/jobs/join-market-queue.js +28 -0
  21. package/dist/helpers/jobs/join-market-queue.js.map +1 -0
  22. package/dist/helpers/jobs/list-job.d.ts +3 -0
  23. package/dist/helpers/jobs/list-job.d.ts.map +1 -0
  24. package/dist/helpers/jobs/list-job.js +20 -0
  25. package/dist/helpers/jobs/list-job.js.map +1 -0
  26. package/dist/helpers/jobs/wait-for-job-state.d.ts +3 -0
  27. package/dist/helpers/jobs/wait-for-job-state.d.ts.map +1 -0
  28. package/dist/helpers/jobs/wait-for-job-state.js +14 -0
  29. package/dist/helpers/jobs/wait-for-job-state.js.map +1 -0
  30. package/dist/helpers/nodes/finish-job.d.ts +3 -0
  31. package/dist/helpers/nodes/finish-job.d.ts.map +1 -0
  32. package/dist/helpers/nodes/finish-job.js +14 -0
  33. package/dist/helpers/nodes/finish-job.js.map +1 -0
  34. package/dist/helpers/nodes/index.d.ts +3 -0
  35. package/dist/helpers/nodes/index.d.ts.map +1 -0
  36. package/dist/helpers/nodes/index.js +3 -0
  37. package/dist/helpers/nodes/index.js.map +1 -0
  38. package/dist/helpers/nodes/verify-job-assigned-to-node.d.ts +6 -0
  39. package/dist/helpers/nodes/verify-job-assigned-to-node.d.ts.map +1 -0
  40. package/dist/helpers/nodes/verify-job-assigned-to-node.js +14 -0
  41. package/dist/helpers/nodes/verify-job-assigned-to-node.js.map +1 -0
  42. package/dist/helpers/resolve-client.d.ts +3 -0
  43. package/dist/helpers/resolve-client.d.ts.map +1 -0
  44. package/dist/helpers/resolve-client.js +5 -0
  45. package/dist/helpers/resolve-client.js.map +1 -0
  46. package/dist/index.d.ts +2 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +2 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/setup.d.ts +5 -0
  51. package/dist/setup.d.ts.map +1 -1
  52. package/dist/setup.js +9 -4
  53. package/dist/setup.js.map +1 -1
  54. package/package.json +2 -2
package/README.md CHANGED
@@ -14,7 +14,7 @@ npm install --save-dev @nosana/scenario
14
14
 
15
15
  ```ts
16
16
  import { describe, it, expect } from 'vitest';
17
- import { getScenarioClient } from '@nosana/scenario';
17
+ import { getScenarioClient, createMarket, listJob } from '@nosana/scenario';
18
18
 
19
19
  describe('scenario: basic', () => {
20
20
  it('works with the Nosana SDK', async () => {
@@ -22,9 +22,27 @@ describe('scenario: basic', () => {
22
22
  const balance = await client.solana.getBalance();
23
23
  expect(balance).toBeGreaterThan(0);
24
24
  });
25
+
26
+ it('creates a market and lists a job', async () => {
27
+ const marketAddress = await createMarket();
28
+ const jobAddress = await listJob({ market: marketAddress });
29
+ expect(jobAddress).toBeDefined();
30
+ });
25
31
  });
26
32
  ```
27
33
 
34
+ ### Multiple Clients
35
+
36
+ Use the `key` option to create independently funded clients — useful for multi-party scenarios:
37
+
38
+ ```ts
39
+ const deployer = await getScenarioClient(); // cached as 'default'
40
+ const node = await getScenarioClient({ key: 'node' }); // separate wallet
41
+ const node2 = await getScenarioClient({ key: 'node2' }); // another separate wallet
42
+ ```
43
+
44
+ Each unique key gets its own keypair, SOL airdrop, and NOS mint on localnet.
45
+
28
46
  ### Run Against Different Networks
29
47
 
30
48
  No code changes needed — just set environment variables:
@@ -87,20 +105,11 @@ pnpm run localnet:down
87
105
 
88
106
  ### `getScenarioClient(options?): Promise<NosanaClient>`
89
107
 
90
- Returns a cached `NosanaClient` for the target network.
91
-
92
- The network is determined by (in order of precedence):
93
- 1. `options.network`
94
- 2. `NOSANA_NETWORK` environment variable
95
- 3. `'localnet'` (default)
96
-
97
- The wallet is determined by (in order of precedence):
98
- 1. `options.wallet`
99
- 2. `NOSANA_WALLET` environment variable (path to a Solana keypair JSON file)
100
- 3. Auto-generated keypair (localnet only)
108
+ Returns a cached `NosanaClient` for the target network. Each unique `key` gets its own independently funded client instance.
101
109
 
102
110
  | Option | Type | Default | Description |
103
111
  |--------|------|---------|-------------|
112
+ | `key` | `string` | `'default'` | Cache key — each unique key creates a separate client with its own wallet |
104
113
  | `network` | `'localnet' \| 'devnet' \| 'mainnet'` | `NOSANA_NETWORK` env or `'localnet'` | Target network |
105
114
  | `wallet` | `Wallet` | `NOSANA_WALLET` env or auto-generated (localnet) | Wallet signer |
106
115
  | `airdropAmount` | `bigint` | `2_000_000_000n` | SOL airdrop amount (localnet only) |
@@ -115,19 +124,99 @@ The wallet is determined by (in order of precedence):
115
124
 
116
125
  Returns a cached `NosanaClient` connected to localnet. Equivalent to `getScenarioClient({ network: 'localnet' })`.
117
126
 
118
- ### `mintNosTo(client, recipient, amount): Promise<void>`
127
+ ---
128
+
129
+ ### Helper Functions
130
+
131
+ All helper functions include built-in vitest `expect` assertions and accept an optional `clientOverride` parameter. When omitted, they use the default scenario client (`getScenarioClient()`).
132
+
133
+ #### Jobs
134
+
135
+ ##### `createMarket(params?, clientOverride?): Promise<Address>`
136
+
137
+ Create a market on-chain and return its address.
138
+
139
+ ```ts
140
+ const marketAddress = await createMarket();
141
+ const marketAddress = await createMarket({ jobPrice: 1000n });
142
+ ```
143
+
144
+ ##### `closeMarket(marketAddress, clientOverride?): Promise<void>`
145
+
146
+ Close an existing market.
147
+
148
+ ```ts
149
+ await closeMarket(marketAddress.toString());
150
+ ```
151
+
152
+ ##### `listJob(params, clientOverride?): Promise<Address>`
153
+
154
+ List (submit) a job to a market and return the job address. `timeout` defaults to `3600` and `ipfsHash` defaults to a test hash — only `market` is required.
155
+
156
+ ```ts
157
+ const jobAddress = await listJob({ market: marketAddress });
158
+ const jobAddress = await listJob({ market: marketAddress, timeout: 7200 });
159
+ ```
160
+
161
+ ##### `joinMarketQueue(marketAddress, options?, clientOverride?): Promise<void>`
162
+
163
+ Join a market's node queue. Verifies the node is queued by default.
164
+
165
+ ```ts
166
+ const nodeClient = await getScenarioClient({ key: 'node' });
167
+ await joinMarketQueue(marketAddress.toString(), {}, nodeClient);
168
+
169
+ // Disable queue verification
170
+ await joinMarketQueue(marketAddress.toString(), { verifyQueued: false }, nodeClient);
171
+ ```
172
+
173
+ ##### `waitForJobState(jobAddress, expectedState, clientOverride?): Promise<void>`
174
+
175
+ Poll until a job reaches the expected state using vitest's `expect.poll`.
176
+
177
+ ```ts
178
+ import { JobState } from '@nosana/scenario';
179
+
180
+ await waitForJobState(jobAddress.toString(), JobState.RUNNING);
181
+ ```
182
+
183
+ #### Nodes
184
+
185
+ ##### `finishJob(jobAddress, clientOverride?): Promise<void>`
186
+
187
+ Finish (complete) a job as a node, submitting a default IPFS results hash.
188
+
189
+ ```ts
190
+ const nodeClient = await getScenarioClient({ key: 'node' });
191
+ await finishJob(jobAddress.toString(), nodeClient);
192
+ ```
193
+
194
+ ##### `verifyJobAssignedToNode(jobAddress, options?, clientOverride?): Promise<void>`
195
+
196
+ Assert that a job is assigned to the client's wallet. Optionally verify the job state.
197
+
198
+ ```ts
199
+ const nodeClient = await getScenarioClient({ key: 'node' });
200
+ await verifyJobAssignedToNode(jobAddress.toString(), { expectedState: 1 }, nodeClient);
201
+ ```
202
+
203
+ ---
204
+
205
+ ### Utilities
206
+
207
+ #### `mintNosTo(client, recipient, amount): Promise<void>`
119
208
 
120
209
  Mint NOS tokens to any address on the localnet.
121
210
 
122
- ### `ensureLocalnetMint(client): Promise<{ mintAuthority, mintAddress }>`
211
+ #### `ensureLocalnetMint(client): Promise<{ mintAuthority, mintAddress }>`
123
212
 
124
213
  Ensures the NOS mint exists on localnet. Creates it if it doesn't exist.
125
214
 
126
- ### `executeInstructionPlan(client, plan): Promise<void>`
215
+ #### `executeInstructionPlan(client, plan): Promise<void>`
127
216
 
128
217
  Execute a Solana instruction plan using the client's wallet as fee payer.
129
218
 
130
- ### `defineScenarioVitestConfig(overrides?): object`
219
+ #### `defineScenarioVitestConfig(overrides?): object`
131
220
 
132
221
  Returns a Vitest config object with the scenario setup file pre-configured.
133
222
 
@@ -138,4 +227,4 @@ Returns a Vitest config object with the scenario setup file pre-configured.
138
227
 
139
228
  ### Re-exports from `@nosana/kit`
140
229
 
141
- - `NosanaNetwork`, `type NosanaClient`, `type Wallet`, `type Address`
230
+ - `NosanaNetwork`, `JobState`, `type NosanaClient`, `type Wallet`, `type Address`
@@ -0,0 +1,3 @@
1
+ export { createMarket, closeMarket, listJob, joinMarketQueue, waitForJobState, type JoinMarketQueueOptions, } from './jobs/index.js';
2
+ export { finishJob, verifyJobAssignedToNode, type VerifyJobAssignedOptions, } from './nodes/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createMarket, closeMarket, listJob, joinMarketQueue, waitForJobState, } from './jobs/index.js';
2
+ export { finishJob, verifyJobAssignedToNode, } from './nodes/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,GAEhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,uBAAuB,GAExB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type NosanaClient } from '@nosana/kit';
2
+ export declare function closeMarket(marketAddress: string, clientOverride?: NosanaClient): Promise<void>;
3
+ //# sourceMappingURL=close-market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-market.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/close-market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,11 @@
1
+ import { address } from '@nosana/kit';
2
+ import { expect } from 'vitest';
3
+ import { resolveClient } from '../resolve-client.js';
4
+ export async function closeMarket(marketAddress, clientOverride) {
5
+ const client = await resolveClient(clientOverride);
6
+ const market = address(marketAddress);
7
+ const instruction = await client.jobs.closeMarket({ market });
8
+ const tx = await client.solana.buildSignAndSend(instruction);
9
+ expect(tx).not.toBeNull();
10
+ }
11
+ //# sourceMappingURL=close-market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-market.js","sourceRoot":"","sources":["../../../src/helpers/jobs/close-market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,aAAqB,EACrB,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Address, NosanaClient, OpenParams } from '@nosana/kit';
2
+ export declare function createMarket(params?: OpenParams, clientOverride?: NosanaClient): Promise<Address>;
3
+ //# sourceMappingURL=create-market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-market.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/create-market.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKrE,wBAAsB,YAAY,CAChC,MAAM,GAAE,UAAe,EACvB,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,OAAO,CAAC,CAYlB"}
@@ -0,0 +1,14 @@
1
+ import { JobsClient } from '@nosana/kit';
2
+ import { expect } from 'vitest';
3
+ import { resolveClient } from '../resolve-client.js';
4
+ export async function createMarket(params = {}, clientOverride) {
5
+ const client = await resolveClient(clientOverride);
6
+ const instruction = await client.jobs.createMarket(params);
7
+ const tx = await client.solana.buildSignAndSend(instruction);
8
+ const parsed = JobsClient.parseOpenInstruction(instruction);
9
+ const marketAddress = parsed.accounts.market.address;
10
+ expect(marketAddress).toBeDefined();
11
+ expect(tx).not.toBeNull();
12
+ return marketAddress;
13
+ }
14
+ //# sourceMappingURL=create-market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-market.js","sourceRoot":"","sources":["../../../src/helpers/jobs/create-market.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAqB,EAAE,EACvB,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IAErD,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAE1B,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { createMarket } from './create-market.js';
2
+ export { closeMarket } from './close-market.js';
3
+ export { listJob } from './list-job.js';
4
+ export { joinMarketQueue, type JoinMarketQueueOptions } from './join-market-queue.js';
5
+ export { waitForJobState } from './wait-for-job-state.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { createMarket } from './create-market.js';
2
+ export { closeMarket } from './close-market.js';
3
+ export { listJob } from './list-job.js';
4
+ export { joinMarketQueue } from './join-market-queue.js';
5
+ export { waitForJobState } from './wait-for-job-state.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAA+B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type NosanaClient } from '@nosana/kit';
2
+ export interface JoinMarketQueueOptions {
3
+ verifyQueued?: boolean;
4
+ }
5
+ export declare function joinMarketQueue(marketAddress: string, options?: JoinMarketQueueOptions, clientOverride?: NosanaClient): Promise<void>;
6
+ //# sourceMappingURL=join-market-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-market-queue.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/join-market-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,sBAA2B,EACpC,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,28 @@
1
+ import { address } from '@nosana/kit';
2
+ import { expect } from 'vitest';
3
+ import { resolveClient } from '../resolve-client.js';
4
+ export async function joinMarketQueue(marketAddress, options = {}, clientOverride) {
5
+ const client = await resolveClient(clientOverride);
6
+ const market = address(marketAddress);
7
+ const { verifyQueued = true } = options;
8
+ const instruction = await client.jobs.work({ market });
9
+ try {
10
+ await client.solana.buildSignAndSend(instruction);
11
+ }
12
+ catch (error) {
13
+ const err = error;
14
+ const errorCode = err?.details?.cause?.context?.code;
15
+ const errorLogs = err?.context?.logs || [];
16
+ const hasNodeAlreadyQueued = errorCode === 6014 || errorLogs.some((log) => log.includes('NodeAlreadyQueued'));
17
+ if (!hasNodeAlreadyQueued) {
18
+ throw error;
19
+ }
20
+ }
21
+ if (verifyQueued) {
22
+ const marketAfter = await client.jobs.market(market);
23
+ const nodeAddress = client.wallet.address.toString();
24
+ const queueAddresses = marketAfter.queue.map((addr) => addr.toString());
25
+ expect(queueAddresses).toContain(nodeAddress);
26
+ }
27
+ }
28
+ //# sourceMappingURL=join-market-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-market-queue.js","sourceRoot":"","sources":["../../../src/helpers/jobs/join-market-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAMrD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAqB,EACrB,UAAkC,EAAE,EACpC,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAGX,CAAC;QACF,MAAM,SAAS,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;QACrD,MAAM,SAAS,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3C,MAAM,oBAAoB,GACxB,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAEnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Address, ListParams, NosanaClient } from '@nosana/kit';
2
+ export declare function listJob(params: Omit<ListParams, 'timeout' | 'ipfsHash'> & Partial<Pick<ListParams, 'timeout' | 'ipfsHash'>>, clientOverride?: NosanaClient): Promise<Address>;
3
+ //# sourceMappingURL=list-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-job.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/list-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQrE,wBAAsB,OAAO,CAC3B,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,GAC9C,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,EACnD,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,OAAO,CAAC,CAgBlB"}
@@ -0,0 +1,20 @@
1
+ import { JobsClient } from '@nosana/kit';
2
+ import { expect } from 'vitest';
3
+ import { resolveClient } from '../resolve-client.js';
4
+ const DEFAULT_TIMEOUT = 3600;
5
+ const DEFAULT_IPFS_HASH = 'QmVp8m3Uq1Cm6JJ3NsuTMSGLNnqXa1mC85uV7YxBREQ78p';
6
+ export async function listJob(params, clientOverride) {
7
+ const client = await resolveClient(clientOverride);
8
+ const instruction = await client.jobs.list({
9
+ timeout: DEFAULT_TIMEOUT,
10
+ ipfsHash: DEFAULT_IPFS_HASH,
11
+ ...params,
12
+ });
13
+ const tx = await client.solana.buildSignAndSend(instruction);
14
+ const parsed = JobsClient.parseListInstruction(instruction);
15
+ const jobAddress = parsed.accounts.job.address;
16
+ expect(jobAddress).toBeDefined();
17
+ expect(tx).not.toBeNull();
18
+ return jobAddress;
19
+ }
20
+ //# sourceMappingURL=list-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-job.js","sourceRoot":"","sources":["../../../src/helpers/jobs/list-job.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,iBAAiB,GAAG,gDAAgD,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MACmD,EACnD,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,iBAAiB;QAC3B,GAAG,MAAM;KACV,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;IAE/C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAE1B,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { JobState, type NosanaClient } from '@nosana/kit';
2
+ export declare function waitForJobState(jobAddress: string, expectedState: JobState, clientOverride?: NosanaClient): Promise<void>;
3
+ //# sourceMappingURL=wait-for-job-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-for-job-state.d.ts","sourceRoot":"","sources":["../../../src/helpers/jobs/wait-for-job-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAInE,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,QAAQ,EACvB,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -0,0 +1,14 @@
1
+ import { address } from '@nosana/kit';
2
+ import { expect } from 'vitest';
3
+ import { resolveClient } from '../resolve-client.js';
4
+ export async function waitForJobState(jobAddress, expectedState, clientOverride) {
5
+ const client = await resolveClient(clientOverride);
6
+ const job = address(jobAddress);
7
+ await expect
8
+ .poll(async () => {
9
+ const fetched = await client.jobs.get(job);
10
+ return fetched?.state;
11
+ }, { message: `Waiting for job to reach ${expectedState} state` })
12
+ .toBe(expectedState);
13
+ }
14
+ //# sourceMappingURL=wait-for-job-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-for-job-state.js","sourceRoot":"","sources":["../../../src/helpers/jobs/wait-for-job-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA+B,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,aAAuB,EACvB,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhC,MAAM,MAAM;SACT,IAAI,CACH,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,OAAO,EAAE,KAAK,CAAC;IACxB,CAAC,EACD,EAAE,OAAO,EAAE,4BAA4B,aAAa,QAAQ,EAAE,CAC/D;SACA,IAAI,CAAC,aAAa,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type NosanaClient } from '@nosana/kit';
2
+ export declare function finishJob(jobAddress: string, clientOverride?: NosanaClient): Promise<void>;
3
+ //# sourceMappingURL=finish-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finish-job.d.ts","sourceRoot":"","sources":["../../../src/helpers/nodes/finish-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhG"}
@@ -0,0 +1,14 @@
1
+ import { address } from '@nosana/kit';
2
+ import { expect } from 'vitest';
3
+ import { resolveClient } from '../resolve-client.js';
4
+ export async function finishJob(jobAddress, clientOverride) {
5
+ const client = await resolveClient(clientOverride);
6
+ const job = address(jobAddress);
7
+ const instruction = await client.jobs.finish({
8
+ job,
9
+ ipfsResultsHash: 'QmV2iq3gexzSwPAbhBAPVDip7Pu6k7whECUa4wzUjnPtdA',
10
+ });
11
+ const tx = await client.solana.buildSignAndSend(instruction);
12
+ expect(tx).not.toBeNull();
13
+ }
14
+ //# sourceMappingURL=finish-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finish-job.js","sourceRoot":"","sources":["../../../src/helpers/nodes/finish-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,cAA6B;IAC/E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3C,GAAG;QACH,eAAe,EAAE,gDAAgD;KAClE,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { finishJob } from './finish-job.js';
2
+ export { verifyJobAssignedToNode, type VerifyJobAssignedOptions, } from './verify-job-assigned-to-node.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/nodes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { finishJob } from './finish-job.js';
2
+ export { verifyJobAssignedToNode, } from './verify-job-assigned-to-node.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/nodes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,uBAAuB,GAExB,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type NosanaClient } from '@nosana/kit';
2
+ export type VerifyJobAssignedOptions = {
3
+ expectedState?: number;
4
+ };
5
+ export declare function verifyJobAssignedToNode(jobAddress: string, options?: VerifyJobAssignedOptions, clientOverride?: NosanaClient): Promise<void>;
6
+ //# sourceMappingURL=verify-job-assigned-to-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-job-assigned-to-node.d.ts","sourceRoot":"","sources":["../../../src/helpers/nodes/verify-job-assigned-to-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,wBAAwB,EAClC,cAAc,CAAC,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAWf"}
@@ -0,0 +1,14 @@
1
+ import { address } from '@nosana/kit';
2
+ import { expect } from 'vitest';
3
+ import { resolveClient } from '../resolve-client.js';
4
+ export async function verifyJobAssignedToNode(jobAddress, options, clientOverride) {
5
+ const client = await resolveClient(clientOverride);
6
+ const job = address(jobAddress);
7
+ const { state, node } = await client.jobs.get(job);
8
+ const nodeAddress = client.wallet.address.toString();
9
+ expect(node).toBe(nodeAddress);
10
+ if (options?.expectedState !== undefined) {
11
+ expect(state).toBe(options.expectedState);
12
+ }
13
+ }
14
+ //# sourceMappingURL=verify-job-assigned-to-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-job-assigned-to-node.js","sourceRoot":"","sources":["../../../src/helpers/nodes/verify-job-assigned-to-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAMrD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAkB,EAClB,OAAkC,EAClC,cAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAEtD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE/B,IAAI,OAAO,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { NosanaClient } from '@nosana/kit';
2
+ export declare function resolveClient(clientOverride?: NosanaClient): Promise<NosanaClient>;
3
+ //# sourceMappingURL=resolve-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-client.d.ts","sourceRoot":"","sources":["../../src/helpers/resolve-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAsB,aAAa,CAAC,cAAc,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAExF"}
@@ -0,0 +1,5 @@
1
+ import { getScenarioClient } from '../setup.js';
2
+ export async function resolveClient(clientOverride) {
3
+ return clientOverride ?? (await getScenarioClient());
4
+ }
5
+ //# sourceMappingURL=resolve-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-client.js","sourceRoot":"","sources":["../../src/helpers/resolve-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,cAA6B;IAC/D,OAAO,cAAc,IAAI,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;AACvD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export { getScenarioClient, getLocalnetClient, type ScenarioClientOptions, type LocalnetClientOptions, } from './setup.js';
2
2
  export { mintNosTo, ensureLocalnetMint, executeInstructionPlan, loadMintKeypairSigner, loadMintAuthoritySigner, } from './utils.js';
3
+ export { createMarket, closeMarket, listJob, joinMarketQueue, waitForJobState, finishJob, verifyJobAssignedToNode, type JoinMarketQueueOptions, type VerifyJobAssignedOptions, } from './helpers/index.js';
3
4
  export { scenarioVitestSetup } from './vitest-setup-fn.js';
4
5
  export { defineScenarioVitestConfig } from './vitest-config.js';
5
6
  export { startLocalnet, stopLocalnet, LOCALNET_RPC_ENDPOINT, LOCALNET_WS_ENDPOINT, type LocalnetOptions, } from '@nosana/localnet';
6
7
  export type { NosanaClient, Wallet, Address } from '@nosana/kit';
7
- export { NosanaNetwork } from '@nosana/kit';
8
+ export { NosanaNetwork, JobState } from '@nosana/kit';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,SAAS,EACT,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,9 @@
1
1
  export { getScenarioClient, getLocalnetClient, } from './setup.js';
2
2
  export { mintNosTo, ensureLocalnetMint, executeInstructionPlan, loadMintKeypairSigner, loadMintAuthoritySigner, } from './utils.js';
3
+ export { createMarket, closeMarket, listJob, joinMarketQueue, waitForJobState, finishJob, verifyJobAssignedToNode, } from './helpers/index.js';
3
4
  export { scenarioVitestSetup } from './vitest-setup-fn.js';
4
5
  export { defineScenarioVitestConfig } from './vitest-config.js';
5
6
  // Re-export localnet helpers for convenience
6
7
  export { startLocalnet, stopLocalnet, LOCALNET_RPC_ENDPOINT, LOCALNET_WS_ENDPOINT, } from '@nosana/localnet';
7
- export { NosanaNetwork } from '@nosana/kit';
8
+ export { NosanaNetwork, JobState } from '@nosana/kit';
8
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAGlB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,6CAA6C;AAC7C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAGlB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,SAAS,EACT,uBAAuB,GAGxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,6CAA6C;AAC7C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
package/dist/setup.d.ts CHANGED
@@ -29,6 +29,11 @@ export interface ScenarioClientOptions extends LocalnetClientOptions {
29
29
  * pointing to a Solana keypair JSON file).
30
30
  */
31
31
  network?: 'localnet' | 'devnet' | 'mainnet';
32
+ /**
33
+ * Cache key for the client instance. Each unique key gets its own
34
+ * independently funded client. Defaults to `'default'`.
35
+ */
36
+ key?: string;
32
37
  }
33
38
  /**
34
39
  * Returns a cached Nosana client connected to localnet.
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC7C;AAmCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAKxF;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAKxF"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAE5C;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAmCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAKxF;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAWxF"}
package/dist/setup.js CHANGED
@@ -74,17 +74,22 @@ async function loadWalletFromFile(filePath) {
74
74
  * ```
75
75
  */
76
76
  export function getScenarioClient(options) {
77
- if (!globalWithScenario.__NOSANA_SCENARIO_CLIENT__) {
78
- globalWithScenario.__NOSANA_SCENARIO_CLIENT__ = createScenarioClientInstance(options);
77
+ if (!globalWithScenario.__NOSANA_SCENARIO_CLIENTS__) {
78
+ globalWithScenario.__NOSANA_SCENARIO_CLIENTS__ = new Map();
79
79
  }
80
- return globalWithScenario.__NOSANA_SCENARIO_CLIENT__;
80
+ const resolvedKey = options?.key ?? 'default';
81
+ const clients = globalWithScenario.__NOSANA_SCENARIO_CLIENTS__;
82
+ if (!clients.has(resolvedKey)) {
83
+ clients.set(resolvedKey, createScenarioClientInstance(options));
84
+ }
85
+ return clients.get(resolvedKey);
81
86
  }
82
87
  async function createScenarioClientInstance(options) {
83
88
  const network = options?.network ??
84
89
  process.env.NOSANA_NETWORK ??
85
90
  'localnet';
86
91
  if (network === 'localnet') {
87
- return getLocalnetClient(options);
92
+ return createLocalnetClientInstance(options);
88
93
  }
89
94
  const wallet = options?.wallet ?? (await resolveWalletFromEnv());
90
95
  if (!wallet) {
package/dist/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nosana/scenario",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "Nosana scenario test helpers: network-aware client setup for localnet, devnet, and mainnet",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -59,5 +59,5 @@
59
59
  "package.json",
60
60
  "README.md"
61
61
  ],
62
- "gitHead": "fe1fb33d98b537b781b3cce80f78f6e61c1d1cd4"
62
+ "gitHead": "9b58da22f18b0391ef29d2657055b0ac0b9c53c6"
63
63
  }