@nosana/kit
Version:
Nosana KIT
104 lines • 3.66 kB
JavaScript
import { NosanaNetwork } from '@nosana/types';
import { createIpfsClient } from '@nosana/ipfs';
import { createNosanaApi } from '@nosana/api';
import { createNosanaAuthorization } from '@nosana/authorization';
import { Logger } from './logger/Logger.js';
import { getNosanaConfig } from './config/index.js';
import { createJobsProgram } from './services/programs/jobs/index.js';
import { createStakeProgram } from './services/programs/stake/index.js';
import { createMerkleDistributorProgram, } from './services/programs/merkleDistributor/index.js';
import { createSolanaService } from './services/solana/index.js';
import { createTokenService } from './services/token/index.js';
import { walletToAuthorizationSigner } from './utils/walletToAuthorizationSigner.js';
/**
* Creates a new Nosana client instance.
*
*
* @param network - The network to connect to (default: MAINNET)
* @param customConfig - Optional custom configuration to override defaults
* @returns A Nosana client instance with all services and programs
*
* @example
* ```ts
* import { createNosanaClient, NosanaNetwork } from '@nosana/kit';
*
* const client = createNosanaClient(NosanaNetwork.MAINNET);
* client.wallet = myWallet;
* ```
*/
export function createNosanaClient(network = NosanaNetwork.MAINNET, customConfig) {
const config = getNosanaConfig(network, customConfig);
const logger = Logger.getInstance({ level: config.logLevel });
// Wallet management
let wallet = config.wallet;
const getWallet = () => wallet;
// Create Solana services
const solana = createSolanaService({
logger,
getWallet,
}, config.solana);
// Initialize TokenService with minimal dependencies
const nos = createTokenService({
logger,
solana,
}, {
tokenAddress: config.programs.nosTokenAddress,
});
// Create program dependencies
const programDeps = {
logger,
solana,
nos,
getWallet,
};
// Initialize programs
const jobs = createJobsProgram(programDeps, config.programs);
const stake = createStakeProgram(programDeps, config.programs);
const merkleDistributor = createMerkleDistributorProgram(programDeps, config.programs);
// Initialize Nosana Modules
const ipfs = createIpfsClient(config.ipfs);
const createReactiveNosanaModules = () => {
const authorization = wallet
? createNosanaAuthorization(walletToAuthorizationSigner(wallet))
: createNosanaAuthorization();
// Use API key if provided, otherwise fall back to wallet-based auth
const api = config.api?.apiKey
? createNosanaApi(network, config.api.apiKey)
: wallet
? createNosanaApi(network, {
identifier: wallet.address.toString(),
generate: authorization.generate,
})
: undefined;
return {
authorization,
api,
};
};
let reactiveNosanaModules = createReactiveNosanaModules();
// Build and return the client
return {
config,
logger,
solana,
nos,
jobs,
stake,
merkleDistributor,
ipfs,
get authorization() {
return reactiveNosanaModules.authorization;
},
get api() {
return reactiveNosanaModules.api;
},
get wallet() {
return wallet;
},
set wallet(value) {
wallet = value;
reactiveNosanaModules = createReactiveNosanaModules();
},
};
}
//# sourceMappingURL=NosanaClient.js.map