Quick Start
Get started with Nosana Kit in minutes.
TIP
This guide assumes you have a basic understanding of TypeScript and Solana. If you're new to Solana, check out the Solana documentation first.
Installation
bash
npm install @nosana/kitBasic Usage
ts
import { function createNosanaClient(network: NosanaNetwork | undefined, customConfig: PartialClientConfig & {
connect: ConnectFactoryConfig & {
clientSecret: string;
};
}): NosanaClient & {
connect: ServerConnect;
} (+3 overloads)
createNosanaClient, type NosanaNetwork = "mainnet" | "devnet" | "localnet"
const NosanaNetwork: {
readonly MAINNET: "mainnet";
readonly DEVNET: "devnet";
readonly LOCALNET: "localnet";
}
NosanaNetwork, function address<TAddress extends string = string>(putativeAddress: TAddress): Address<TAddress>Combines _asserting_ that a string is an address with _coercing_ it to the
{@link
Address
}
type.
It's most useful with untrusted input.address } from '@nosana/kit';
import type { type Job = Omit<ConvertTypesForDb<JobAccountArgs>, "state"> & {
address: Address;
state: JobState;
}
Job, NosanaClient } from '@nosana/kit';
// Initialize with mainnet defaults
const const client: NosanaClientclient = function createNosanaClient(network?: NosanaNetwork, customConfig?: PartialClientConfig): NosanaClient (+3 overloads)createNosanaClient();
// Or specify network and configuration
const const client2: NosanaClientclient2: NosanaClient = function createNosanaClient(network?: NosanaNetwork, customConfig?: PartialClientConfig): NosanaClient (+3 overloads)createNosanaClient(const NosanaNetwork: {
readonly MAINNET: "mainnet";
readonly DEVNET: "devnet";
readonly LOCALNET: "localnet";
}
NosanaNetwork.type DEVNET: "devnet"DEVNET, {
PartialClientConfig.solana?: Partial<SolanaConfig> | undefinedsolana: {
rpcEndpoint?: string | undefinedrpcEndpoint: 'https://your-custom-rpc.com',
},
});
// Fetch a job by address
const const job: Jobjob: type Job = Omit<ConvertTypesForDb<JobAccountArgs>, "state"> & {
address: Address;
state: JobState;
}
Job = await const client: NosanaClientclient.NosanaClient.jobs: JobsProgramjobs.JobsProgram.get(addr: Address, checkRun?: boolean): Promise<Job>Fetch a job account by addressget('job-address' as any);
var console: ConsoleThe `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v24.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v24.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v24.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```console.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v24.x/api/util.html#utilformatformat-args) for more information.log('Job state:', const job: Jobjob.state: JobStatestate);
// Query jobs with filters
import { enum JobStateJobState } from '@nosana/kit';
const const completedJobs: Job[]completedJobs: type Job = Omit<ConvertTypesForDb<JobAccountArgs>, "state"> & {
address: Address;
state: JobState;
}
Job[] = await const client: NosanaClientclient.NosanaClient.jobs: JobsProgramjobs.JobsProgram.all(filters?: {
state?: JobState;
market?: Address;
node?: Address;
project?: Address;
}, checkRuns?: boolean): Promise<Job[]>
Fetch all job accountsall({
market?: Address | undefinedmarket: address<"market-address">(putativeAddress: "market-address"): Address<"market-address">Combines _asserting_ that a string is an address with _coercing_ it to the
{@link
Address
}
type.
It's most useful with untrusted input.address('market-address'),
state?: JobState | undefinedstate: enum JobStateJobState.function (enum member) JobState.COMPLETED = 2COMPLETED,
});INFO
The client object is typed as NosanaClient, which provides full TypeScript autocomplete and type checking for all available methods and properties.
Next Steps
- Learn about Configuration to customize your client
- Explore the Jobs Program for more advanced usage
- Check out Examples for real-world use cases