@nosana/kit 0.1.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.
- package/.gitlab-ci.yml +21 -0
- package/README.md +159 -0
- package/dist/config/defaultConfigs.d.ts +2 -0
- package/dist/config/defaultConfigs.js +47 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.js +19 -0
- package/dist/config/types.d.ts +43 -0
- package/dist/config/types.js +16 -0
- package/dist/config/utils.d.ts +3 -0
- package/dist/config/utils.js +35 -0
- package/dist/errors/NosanaError.d.ts +16 -0
- package/dist/errors/NosanaError.js +22 -0
- package/dist/generated_clients/jobs/accounts/index.d.ts +10 -0
- package/dist/generated_clients/jobs/accounts/index.js +26 -0
- package/dist/generated_clients/jobs/accounts/jobAccount.d.ts +47 -0
- package/dist/generated_clients/jobs/accounts/jobAccount.js +86 -0
- package/dist/generated_clients/jobs/accounts/marketAccount.d.ts +46 -0
- package/dist/generated_clients/jobs/accounts/marketAccount.js +82 -0
- package/dist/generated_clients/jobs/accounts/runAccount.d.ts +35 -0
- package/dist/generated_clients/jobs/accounts/runAccount.js +74 -0
- package/dist/generated_clients/jobs/errors/index.d.ts +8 -0
- package/dist/generated_clients/jobs/errors/index.js +24 -0
- package/dist/generated_clients/jobs/errors/nosanaJobs.d.ts +57 -0
- package/dist/generated_clients/jobs/errors/nosanaJobs.js +85 -0
- package/dist/generated_clients/jobs/index.d.ts +12 -0
- package/dist/generated_clients/jobs/index.js +28 -0
- package/dist/generated_clients/jobs/instructions/claim.d.ts +60 -0
- package/dist/generated_clients/jobs/instructions/claim.js +102 -0
- package/dist/generated_clients/jobs/instructions/clean.d.ts +42 -0
- package/dist/generated_clients/jobs/instructions/clean.js +79 -0
- package/dist/generated_clients/jobs/instructions/cleanAdmin.d.ts +42 -0
- package/dist/generated_clients/jobs/instructions/cleanAdmin.js +79 -0
- package/dist/generated_clients/jobs/instructions/close.d.ts +48 -0
- package/dist/generated_clients/jobs/instructions/close.js +90 -0
- package/dist/generated_clients/jobs/instructions/closeAdmin.d.ts +48 -0
- package/dist/generated_clients/jobs/instructions/closeAdmin.js +90 -0
- package/dist/generated_clients/jobs/instructions/complete.d.ts +43 -0
- package/dist/generated_clients/jobs/instructions/complete.js +82 -0
- package/dist/generated_clients/jobs/instructions/delist.d.ts +54 -0
- package/dist/generated_clients/jobs/instructions/delist.js +96 -0
- package/dist/generated_clients/jobs/instructions/end.d.ts +60 -0
- package/dist/generated_clients/jobs/instructions/end.js +102 -0
- package/dist/generated_clients/jobs/instructions/extend.d.ts +64 -0
- package/dist/generated_clients/jobs/instructions/extend.js +111 -0
- package/dist/generated_clients/jobs/instructions/finish.d.ts +67 -0
- package/dist/generated_clients/jobs/instructions/finish.js +111 -0
- package/dist/generated_clients/jobs/instructions/index.d.ts +25 -0
- package/dist/generated_clients/jobs/instructions/index.js +41 -0
- package/dist/generated_clients/jobs/instructions/list.d.ts +76 -0
- package/dist/generated_clients/jobs/instructions/list.js +126 -0
- package/dist/generated_clients/jobs/instructions/open.d.ts +73 -0
- package/dist/generated_clients/jobs/instructions/open.js +121 -0
- package/dist/generated_clients/jobs/instructions/quit.d.ts +45 -0
- package/dist/generated_clients/jobs/instructions/quit.js +82 -0
- package/dist/generated_clients/jobs/instructions/quitAdmin.d.ts +42 -0
- package/dist/generated_clients/jobs/instructions/quitAdmin.js +79 -0
- package/dist/generated_clients/jobs/instructions/recover.d.ts +54 -0
- package/dist/generated_clients/jobs/instructions/recover.js +96 -0
- package/dist/generated_clients/jobs/instructions/stop.d.ts +42 -0
- package/dist/generated_clients/jobs/instructions/stop.js +79 -0
- package/dist/generated_clients/jobs/instructions/update.d.ts +58 -0
- package/dist/generated_clients/jobs/instructions/update.js +93 -0
- package/dist/generated_clients/jobs/instructions/work.d.ts +57 -0
- package/dist/generated_clients/jobs/instructions/work.js +99 -0
- package/dist/generated_clients/jobs/programs/index.d.ts +8 -0
- package/dist/generated_clients/jobs/programs/index.js +24 -0
- package/dist/generated_clients/jobs/programs/nosanaJobs.d.ts +78 -0
- package/dist/generated_clients/jobs/programs/nosanaJobs.js +112 -0
- package/dist/generated_clients/jobs/shared/index.d.ts +49 -0
- package/dist/generated_clients/jobs/shared/index.js +94 -0
- package/dist/generated_clients/jobs/types/index.d.ts +10 -0
- package/dist/generated_clients/jobs/types/index.js +26 -0
- package/dist/generated_clients/jobs/types/jobState.d.ts +18 -0
- package/dist/generated_clients/jobs/types/jobState.js +30 -0
- package/dist/generated_clients/jobs/types/jobType.d.ts +21 -0
- package/dist/generated_clients/jobs/types/jobType.js +33 -0
- package/dist/generated_clients/jobs/types/queueType.d.ts +18 -0
- package/dist/generated_clients/jobs/types/queueType.js +30 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +43 -0
- package/dist/ipfs/IPFS.d.ts +19 -0
- package/dist/ipfs/IPFS.js +47 -0
- package/dist/logger/Logger.d.ts +24 -0
- package/dist/logger/Logger.js +63 -0
- package/dist/programs/BaseProgram.d.ts +20 -0
- package/dist/programs/BaseProgram.js +39 -0
- package/dist/programs/JobsProgram.d.ts +118 -0
- package/dist/programs/JobsProgram.js +611 -0
- package/dist/solana/SolanaUtils.d.ts +15 -0
- package/dist/solana/SolanaUtils.js +48 -0
- package/dist/utils/index.d.ts +19 -0
- package/dist/utils/index.js +17 -0
- package/examples/node/monitor.ts +143 -0
- package/examples/node/package-lock.json +245 -0
- package/examples/node/package.json +16 -0
- package/examples/node/retrieve.ts +18 -0
- package/package.json +47 -0
- package/scripts/generate-clients.ts +9 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* This code was AUTOGENERATED using the codama library.
|
|
4
|
+
* Please DO NOT EDIT THIS FILE, instead use visitors
|
|
5
|
+
* to add features, then rerun codama to update it.
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/codama-idl/codama
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.JobType = void 0;
|
|
11
|
+
exports.getJobTypeEncoder = getJobTypeEncoder;
|
|
12
|
+
exports.getJobTypeDecoder = getJobTypeDecoder;
|
|
13
|
+
exports.getJobTypeCodec = getJobTypeCodec;
|
|
14
|
+
const kit_1 = require("@solana/kit");
|
|
15
|
+
/** The `JobType` describes the type of any job. */
|
|
16
|
+
var JobType;
|
|
17
|
+
(function (JobType) {
|
|
18
|
+
JobType[JobType["Default"] = 0] = "Default";
|
|
19
|
+
JobType[JobType["Small"] = 1] = "Small";
|
|
20
|
+
JobType[JobType["Medium"] = 2] = "Medium";
|
|
21
|
+
JobType[JobType["Large"] = 3] = "Large";
|
|
22
|
+
JobType[JobType["Gpu"] = 4] = "Gpu";
|
|
23
|
+
JobType[JobType["Unknown"] = 5] = "Unknown";
|
|
24
|
+
})(JobType || (exports.JobType = JobType = {}));
|
|
25
|
+
function getJobTypeEncoder() {
|
|
26
|
+
return (0, kit_1.getEnumEncoder)(JobType);
|
|
27
|
+
}
|
|
28
|
+
function getJobTypeDecoder() {
|
|
29
|
+
return (0, kit_1.getEnumDecoder)(JobType);
|
|
30
|
+
}
|
|
31
|
+
function getJobTypeCodec() {
|
|
32
|
+
return (0, kit_1.combineCodec)(getJobTypeEncoder(), getJobTypeDecoder());
|
|
33
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was AUTOGENERATED using the codama library.
|
|
3
|
+
* Please DO NOT EDIT THIS FILE, instead use visitors
|
|
4
|
+
* to add features, then rerun codama to update it.
|
|
5
|
+
*
|
|
6
|
+
* @see https://github.com/codama-idl/codama
|
|
7
|
+
*/
|
|
8
|
+
import { type Codec, type Decoder, type Encoder } from '@solana/kit';
|
|
9
|
+
/** The `QueueType` describes the type of queue */
|
|
10
|
+
export declare enum QueueType {
|
|
11
|
+
Job = 0,
|
|
12
|
+
Node = 1,
|
|
13
|
+
Empty = 2
|
|
14
|
+
}
|
|
15
|
+
export type QueueTypeArgs = QueueType;
|
|
16
|
+
export declare function getQueueTypeEncoder(): Encoder<QueueTypeArgs>;
|
|
17
|
+
export declare function getQueueTypeDecoder(): Decoder<QueueType>;
|
|
18
|
+
export declare function getQueueTypeCodec(): Codec<QueueTypeArgs, QueueType>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* This code was AUTOGENERATED using the codama library.
|
|
4
|
+
* Please DO NOT EDIT THIS FILE, instead use visitors
|
|
5
|
+
* to add features, then rerun codama to update it.
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/codama-idl/codama
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.QueueType = void 0;
|
|
11
|
+
exports.getQueueTypeEncoder = getQueueTypeEncoder;
|
|
12
|
+
exports.getQueueTypeDecoder = getQueueTypeDecoder;
|
|
13
|
+
exports.getQueueTypeCodec = getQueueTypeCodec;
|
|
14
|
+
const kit_1 = require("@solana/kit");
|
|
15
|
+
/** The `QueueType` describes the type of queue */
|
|
16
|
+
var QueueType;
|
|
17
|
+
(function (QueueType) {
|
|
18
|
+
QueueType[QueueType["Job"] = 0] = "Job";
|
|
19
|
+
QueueType[QueueType["Node"] = 1] = "Node";
|
|
20
|
+
QueueType[QueueType["Empty"] = 2] = "Empty";
|
|
21
|
+
})(QueueType || (exports.QueueType = QueueType = {}));
|
|
22
|
+
function getQueueTypeEncoder() {
|
|
23
|
+
return (0, kit_1.getEnumEncoder)(QueueType);
|
|
24
|
+
}
|
|
25
|
+
function getQueueTypeDecoder() {
|
|
26
|
+
return (0, kit_1.getEnumDecoder)(QueueType);
|
|
27
|
+
}
|
|
28
|
+
function getQueueTypeCodec() {
|
|
29
|
+
return (0, kit_1.combineCodec)(getQueueTypeEncoder(), getQueueTypeDecoder());
|
|
30
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ClientConfig, NosanaNetwork, PartialClientConfig } from './config/index.js';
|
|
2
|
+
import { Logger } from './logger/Logger.js';
|
|
3
|
+
import { JobsProgram } from './programs/JobsProgram.js';
|
|
4
|
+
import { SolanaUtils } from './solana/SolanaUtils.js';
|
|
5
|
+
export declare class NosanaClient {
|
|
6
|
+
readonly config: ClientConfig;
|
|
7
|
+
readonly jobs: JobsProgram;
|
|
8
|
+
readonly solana: SolanaUtils;
|
|
9
|
+
readonly logger: Logger;
|
|
10
|
+
constructor(network?: NosanaNetwork, customConfig?: PartialClientConfig);
|
|
11
|
+
}
|
|
12
|
+
export * from './config/index.js';
|
|
13
|
+
export * from './errors/NosanaError.js';
|
|
14
|
+
export * from './logger/Logger.js';
|
|
15
|
+
export { JobsProgram } from './programs/JobsProgram.js';
|
|
16
|
+
export type { Job, Market, Run } from './programs/JobsProgram.js';
|
|
17
|
+
export * from './ipfs/IPFS.js';
|
|
18
|
+
export * from './generated_clients/jobs/index.js';
|
|
19
|
+
export * from 'gill';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.JobsProgram = exports.NosanaClient = void 0;
|
|
18
|
+
const index_js_1 = require("./config/index.js");
|
|
19
|
+
const Logger_js_1 = require("./logger/Logger.js");
|
|
20
|
+
const JobsProgram_js_1 = require("./programs/JobsProgram.js");
|
|
21
|
+
const SolanaUtils_js_1 = require("./solana/SolanaUtils.js");
|
|
22
|
+
class NosanaClient {
|
|
23
|
+
constructor(network = index_js_1.NosanaNetwork.MAINNET, customConfig) {
|
|
24
|
+
this.config = (0, index_js_1.getNosanaConfig)(network, customConfig);
|
|
25
|
+
this.jobs = new JobsProgram_js_1.JobsProgram(this);
|
|
26
|
+
this.logger = Logger_js_1.Logger.getInstance();
|
|
27
|
+
this.solana = new SolanaUtils_js_1.SolanaUtils(this);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.NosanaClient = NosanaClient;
|
|
31
|
+
// Export types and configuration
|
|
32
|
+
__exportStar(require("./config/index.js"), exports);
|
|
33
|
+
__exportStar(require("./errors/NosanaError.js"), exports);
|
|
34
|
+
__exportStar(require("./logger/Logger.js"), exports);
|
|
35
|
+
// Export JobsProgram and related types
|
|
36
|
+
var JobsProgram_js_2 = require("./programs/JobsProgram.js");
|
|
37
|
+
Object.defineProperty(exports, "JobsProgram", { enumerable: true, get: function () { return JobsProgram_js_2.JobsProgram; } });
|
|
38
|
+
// Export IPFS utilities
|
|
39
|
+
__exportStar(require("./ipfs/IPFS.js"), exports);
|
|
40
|
+
// Export all generated client types and functions
|
|
41
|
+
__exportStar(require("./generated_clients/jobs/index.js"), exports);
|
|
42
|
+
// Export dependencies
|
|
43
|
+
__exportStar(require("gill"), exports);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ReadonlyUint8Array } from 'gill';
|
|
2
|
+
/**
|
|
3
|
+
* Class to interact with Pinata Cloud
|
|
4
|
+
* https://www.pinata.cloud/
|
|
5
|
+
*/
|
|
6
|
+
export declare class IPFS {
|
|
7
|
+
/**
|
|
8
|
+
* Convert the ipfs bytes from a solana job to a CID
|
|
9
|
+
* It prepends the 0x1220 (18,32) to make it 34 bytes and Base58 encodes it.
|
|
10
|
+
* This result is IPFS addressable.
|
|
11
|
+
*/
|
|
12
|
+
static solHashToIpfsHash(hashArray: ReadonlyUint8Array): string;
|
|
13
|
+
/**
|
|
14
|
+
* Converts IPFS hash to byte array needed to submit results
|
|
15
|
+
* @param hash IPFS hash
|
|
16
|
+
* @returns Array<number>
|
|
17
|
+
*/
|
|
18
|
+
static IpfsHashToByteArray(hash: string): Uint8Array;
|
|
19
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.IPFS = void 0;
|
|
7
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
8
|
+
/**
|
|
9
|
+
* Class to interact with Pinata Cloud
|
|
10
|
+
* https://www.pinata.cloud/
|
|
11
|
+
*/
|
|
12
|
+
class IPFS {
|
|
13
|
+
/**
|
|
14
|
+
* Convert the ipfs bytes from a solana job to a CID
|
|
15
|
+
* It prepends the 0x1220 (18,32) to make it 34 bytes and Base58 encodes it.
|
|
16
|
+
* This result is IPFS addressable.
|
|
17
|
+
*/
|
|
18
|
+
static solHashToIpfsHash(hashArray) {
|
|
19
|
+
let finalArray;
|
|
20
|
+
if (hashArray.length === 32) {
|
|
21
|
+
// Create a new array with the prepended bytes [18, 32] + original array
|
|
22
|
+
finalArray = new Uint8Array(34);
|
|
23
|
+
finalArray[0] = 18;
|
|
24
|
+
finalArray[1] = 32;
|
|
25
|
+
finalArray.set(hashArray, 2);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Use the array as-is if it's not 32 bytes
|
|
29
|
+
finalArray = new Uint8Array(hashArray);
|
|
30
|
+
}
|
|
31
|
+
return bs58_1.default.encode(Buffer.from(finalArray));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Converts IPFS hash to byte array needed to submit results
|
|
35
|
+
* @param hash IPFS hash
|
|
36
|
+
* @returns Array<number>
|
|
37
|
+
*/
|
|
38
|
+
static IpfsHashToByteArray(hash) {
|
|
39
|
+
if (hash.length === 34) {
|
|
40
|
+
return new Uint8Array([...bs58_1.default.decode(hash).subarray(2)]);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
return new Uint8Array([...bs58_1.default.decode(hash)]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.IPFS = IPFS;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
2
|
+
export interface LoggerOptions {
|
|
3
|
+
level?: LogLevel;
|
|
4
|
+
prefix?: string;
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare class Logger {
|
|
8
|
+
private static instance;
|
|
9
|
+
private level;
|
|
10
|
+
private prefix;
|
|
11
|
+
private enabled;
|
|
12
|
+
private constructor();
|
|
13
|
+
static getInstance(options?: LoggerOptions): Logger;
|
|
14
|
+
private shouldLog;
|
|
15
|
+
private formatMessage;
|
|
16
|
+
debug(message: string): void;
|
|
17
|
+
info(message: string): void;
|
|
18
|
+
warn(message: string): void;
|
|
19
|
+
error(message: string): void;
|
|
20
|
+
setLevel(level: LogLevel): void;
|
|
21
|
+
setPrefix(prefix: string): void;
|
|
22
|
+
enable(): void;
|
|
23
|
+
disable(): void;
|
|
24
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Logger = void 0;
|
|
4
|
+
class Logger {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.level = 'info';
|
|
7
|
+
this.prefix = '[Nosana]';
|
|
8
|
+
this.enabled = true;
|
|
9
|
+
if (options) {
|
|
10
|
+
this.level = options.level || this.level;
|
|
11
|
+
this.prefix = options.prefix || this.prefix;
|
|
12
|
+
this.enabled = options.enabled ?? this.enabled;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
static getInstance(options) {
|
|
16
|
+
if (!Logger.instance) {
|
|
17
|
+
Logger.instance = new Logger(options);
|
|
18
|
+
}
|
|
19
|
+
return Logger.instance;
|
|
20
|
+
}
|
|
21
|
+
shouldLog(messageLevel) {
|
|
22
|
+
if (!this.enabled)
|
|
23
|
+
return false;
|
|
24
|
+
const levels = ['debug', 'info', 'warn', 'error'];
|
|
25
|
+
return levels.indexOf(messageLevel) >= levels.indexOf(this.level);
|
|
26
|
+
}
|
|
27
|
+
formatMessage(level, message) {
|
|
28
|
+
return `${this.prefix} [${level.toUpperCase()}] ${message}`;
|
|
29
|
+
}
|
|
30
|
+
debug(message) {
|
|
31
|
+
if (this.shouldLog('debug')) {
|
|
32
|
+
console.debug(this.formatMessage('debug', message));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
info(message) {
|
|
36
|
+
if (this.shouldLog('info')) {
|
|
37
|
+
console.info(this.formatMessage('info', message));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
warn(message) {
|
|
41
|
+
if (this.shouldLog('warn')) {
|
|
42
|
+
console.warn(this.formatMessage('warn', message));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
error(message) {
|
|
46
|
+
if (this.shouldLog('error')) {
|
|
47
|
+
console.error(this.formatMessage('error', message));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
setLevel(level) {
|
|
51
|
+
this.level = level;
|
|
52
|
+
}
|
|
53
|
+
setPrefix(prefix) {
|
|
54
|
+
this.prefix = prefix;
|
|
55
|
+
}
|
|
56
|
+
enable() {
|
|
57
|
+
this.enabled = true;
|
|
58
|
+
}
|
|
59
|
+
disable() {
|
|
60
|
+
this.enabled = false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.Logger = Logger;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Address } from 'gill';
|
|
2
|
+
import { NosanaClient } from '../index.js';
|
|
3
|
+
export type staticAccounts = {
|
|
4
|
+
rewardsReflection: Address;
|
|
5
|
+
rewardsVault: Address;
|
|
6
|
+
rewardsProgram: Address;
|
|
7
|
+
jobsProgram: Address;
|
|
8
|
+
};
|
|
9
|
+
export declare abstract class BaseProgram {
|
|
10
|
+
private _staticAccounts;
|
|
11
|
+
private _initializingAccounts;
|
|
12
|
+
/**
|
|
13
|
+
* Gets the static accounts, initializing them if needed.
|
|
14
|
+
*/
|
|
15
|
+
protected getStaticAccounts(): Promise<staticAccounts>;
|
|
16
|
+
private initializeStaticAccounts;
|
|
17
|
+
protected readonly sdk: NosanaClient;
|
|
18
|
+
constructor(sdk: NosanaClient);
|
|
19
|
+
protected abstract getProgramId(): Address;
|
|
20
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseProgram = void 0;
|
|
4
|
+
class BaseProgram {
|
|
5
|
+
/**
|
|
6
|
+
* Gets the static accounts, initializing them if needed.
|
|
7
|
+
*/
|
|
8
|
+
async getStaticAccounts() {
|
|
9
|
+
if (this._staticAccounts) {
|
|
10
|
+
return this._staticAccounts;
|
|
11
|
+
}
|
|
12
|
+
// If we're already initializing, return the existing promise
|
|
13
|
+
if (this._initializingAccounts) {
|
|
14
|
+
return this._initializingAccounts;
|
|
15
|
+
}
|
|
16
|
+
// Start initialization and store the promise
|
|
17
|
+
this._initializingAccounts = this.initializeStaticAccounts();
|
|
18
|
+
// Wait for initialization to complete
|
|
19
|
+
this._staticAccounts = await this._initializingAccounts;
|
|
20
|
+
this._initializingAccounts = undefined;
|
|
21
|
+
return this._staticAccounts;
|
|
22
|
+
}
|
|
23
|
+
async initializeStaticAccounts() {
|
|
24
|
+
return {
|
|
25
|
+
rewardsReflection: await this.sdk.solana.pda([
|
|
26
|
+
'reflection',
|
|
27
|
+
], this.sdk.config.programs.rewardsAddress),
|
|
28
|
+
rewardsVault: await this.sdk.solana.pda([
|
|
29
|
+
this.sdk.config.programs.nosTokenAddress,
|
|
30
|
+
], this.sdk.config.programs.rewardsAddress),
|
|
31
|
+
rewardsProgram: this.sdk.config.programs.rewardsAddress,
|
|
32
|
+
jobsProgram: this.sdk.config.programs.jobsAddress
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
constructor(sdk) {
|
|
36
|
+
this.sdk = sdk;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.BaseProgram = BaseProgram;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { BaseProgram } from './BaseProgram.js';
|
|
2
|
+
import { Address, Signature, Account } from 'gill';
|
|
3
|
+
import { NosanaClient } from '../index.js';
|
|
4
|
+
import * as programClient from "../generated_clients/jobs/index.js";
|
|
5
|
+
import { ConvertTypesForDb } from '../utils/index.js';
|
|
6
|
+
export type Job = ConvertTypesForDb<programClient.JobAccountArgs> & {
|
|
7
|
+
address: Address;
|
|
8
|
+
};
|
|
9
|
+
export type Market = ConvertTypesForDb<programClient.MarketAccountArgs> & {
|
|
10
|
+
address: Address;
|
|
11
|
+
};
|
|
12
|
+
export type Run = ConvertTypesForDb<programClient.RunAccountArgs> & {
|
|
13
|
+
address: Address;
|
|
14
|
+
};
|
|
15
|
+
export declare class JobsProgram extends BaseProgram {
|
|
16
|
+
readonly client: typeof programClient;
|
|
17
|
+
constructor(sdk: NosanaClient);
|
|
18
|
+
protected getProgramId(): Address;
|
|
19
|
+
/**
|
|
20
|
+
* Fetch a job account by address
|
|
21
|
+
*/
|
|
22
|
+
get(addr: Address, checkRun?: boolean): Promise<Job>;
|
|
23
|
+
/**
|
|
24
|
+
* Fetch a run account by address
|
|
25
|
+
*/
|
|
26
|
+
run(addr: Address): Promise<Run>;
|
|
27
|
+
/**
|
|
28
|
+
* Fetch a run account by address
|
|
29
|
+
*/
|
|
30
|
+
market(addr: Address): Promise<Market>;
|
|
31
|
+
/**
|
|
32
|
+
* Fetch multiple job accounts by address
|
|
33
|
+
*/
|
|
34
|
+
multiple(addresses: Address[], checkRuns?: boolean): Promise<Job[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Fetch all job accounts
|
|
37
|
+
*/
|
|
38
|
+
all(filters?: {
|
|
39
|
+
state?: number;
|
|
40
|
+
market?: Address;
|
|
41
|
+
node?: Address;
|
|
42
|
+
project?: Address;
|
|
43
|
+
}, checkRuns?: boolean): Promise<Job[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Fetch all run accounts
|
|
46
|
+
*/
|
|
47
|
+
runs(filters?: {
|
|
48
|
+
node?: Address;
|
|
49
|
+
job?: Address;
|
|
50
|
+
}): Promise<Run[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Fetch all market accounts
|
|
53
|
+
*/
|
|
54
|
+
markets(): Promise<Market[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Post a new job to the marketplace
|
|
57
|
+
* @param params Parameters for listing a job
|
|
58
|
+
* @returns The transaction signature
|
|
59
|
+
*/
|
|
60
|
+
post(params: {
|
|
61
|
+
market: Address;
|
|
62
|
+
timeout: number | bigint;
|
|
63
|
+
ipfsHash: string;
|
|
64
|
+
node?: Address;
|
|
65
|
+
instructionOnly?: boolean;
|
|
66
|
+
}): Promise<ReturnType<typeof this.client.getListInstruction> | Signature>;
|
|
67
|
+
/**
|
|
68
|
+
* Monitor program account updates using callback functions
|
|
69
|
+
* Uses WebSocket subscriptions with automatic restart on failure
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* // Example: Monitor job accounts and save to file
|
|
74
|
+
* const stopMonitoring = await jobsProgram.monitor({
|
|
75
|
+
* onJobAccount: async (jobAccount) => {
|
|
76
|
+
* console.log('Job updated:', jobAccount.address.toString());
|
|
77
|
+
* // Save to database, file, or process as needed
|
|
78
|
+
* },
|
|
79
|
+
* onRunAccount: async (runAccount) => {
|
|
80
|
+
* console.log('Run updated:', runAccount.address.toString());
|
|
81
|
+
* },
|
|
82
|
+
* onError: async (error, accountType) => {
|
|
83
|
+
* console.error('Error processing account:', error, accountType);
|
|
84
|
+
* }
|
|
85
|
+
* });
|
|
86
|
+
*
|
|
87
|
+
* // Stop monitoring when done
|
|
88
|
+
* stopMonitoring();
|
|
89
|
+
* ```
|
|
90
|
+
*
|
|
91
|
+
* @param options Configuration options for monitoring
|
|
92
|
+
* @returns A function to stop monitoring
|
|
93
|
+
*/
|
|
94
|
+
monitor(options?: {
|
|
95
|
+
onJobAccount?: (jobAccount: Job) => Promise<void> | void;
|
|
96
|
+
onMarketAccount?: (marketAccount: Market) => Promise<void> | void;
|
|
97
|
+
onRunAccount?: (runAccount: Run) => Promise<void> | void;
|
|
98
|
+
onError?: (error: Error, accountType?: string) => Promise<void> | void;
|
|
99
|
+
}): Promise<() => void>;
|
|
100
|
+
/**
|
|
101
|
+
* Set up WebSocket subscription for program notifications
|
|
102
|
+
*/
|
|
103
|
+
private setupSubscription;
|
|
104
|
+
/**
|
|
105
|
+
* Process subscription notifications
|
|
106
|
+
*/
|
|
107
|
+
private processSubscriptionNotifications;
|
|
108
|
+
transformJobAccount(jobAccount: Account<programClient.JobAccount>): Job;
|
|
109
|
+
transformRunAccount(runAccount: Account<programClient.RunAccount>): Run;
|
|
110
|
+
transformMarketAccount(marketAccount: Account<programClient.MarketAccount>): Market;
|
|
111
|
+
/**
|
|
112
|
+
* Handle account update using callback functions
|
|
113
|
+
*/
|
|
114
|
+
private handleAccountUpdate;
|
|
115
|
+
private handleJobAccount;
|
|
116
|
+
private handleMarketAccount;
|
|
117
|
+
private handleRunAccount;
|
|
118
|
+
}
|