@nosana/node 1.1.14-rc → 1.1.15-rc

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 (77) hide show
  1. package/dist/.env.dev +1 -2
  2. package/dist/.env.prd +1 -2
  3. package/dist/package.json +4 -2
  4. package/dist/src/NodeManager/checkForMaintenance.d.ts +1 -0
  5. package/dist/src/NodeManager/checkForMaintenance.js +40 -0
  6. package/dist/src/NodeManager/clients/hostManager/index.d.ts +4 -0
  7. package/dist/src/NodeManager/clients/hostManager/index.js +25 -0
  8. package/dist/src/NodeManager/clients/maintenanceMiddleware.d.ts +2 -0
  9. package/dist/src/NodeManager/clients/maintenanceMiddleware.js +11 -0
  10. package/dist/src/NodeManager/clients/maintenanceState.d.ts +10 -0
  11. package/dist/src/NodeManager/clients/maintenanceState.js +66 -0
  12. package/dist/src/NodeManager/clients/types.utils.d.ts +45 -0
  13. package/dist/src/NodeManager/configs/configs.d.ts +1 -3
  14. package/dist/src/NodeManager/configs/configs.js +1 -3
  15. package/dist/src/NodeManager/errors/NodeBannedError.d.ts +3 -0
  16. package/dist/src/NodeManager/errors/NodeBannedError.js +6 -0
  17. package/dist/src/NodeManager/errors/NodeNotQualifiedError.d.ts +3 -0
  18. package/dist/src/NodeManager/errors/NodeNotQualifiedError.js +6 -0
  19. package/dist/src/NodeManager/errors/NodeNotRegisteredError.d.ts +3 -0
  20. package/dist/src/NodeManager/errors/NodeNotRegisteredError.js +6 -0
  21. package/dist/src/NodeManager/index.js +25 -57
  22. package/dist/src/NodeManager/monitoring/log/NodeLog.d.ts +0 -1
  23. package/dist/src/NodeManager/monitoring/log/NodeLog.js +11 -38
  24. package/dist/src/NodeManager/monitoring/log/console/ConsoleLogger.d.ts +3 -0
  25. package/dist/src/NodeManager/monitoring/log/console/ConsoleLogger.js +33 -5
  26. package/dist/src/NodeManager/monitoring/ping/PingHandler.d.ts +2 -4
  27. package/dist/src/NodeManager/monitoring/ping/PingHandler.js +31 -26
  28. package/dist/src/NodeManager/monitoring/proxy/loggingProxy.d.ts +2 -1
  29. package/dist/src/NodeManager/monitoring/proxy/loggingProxy.js +2 -3
  30. package/dist/src/NodeManager/node/Node.d.ts +4 -6
  31. package/dist/src/NodeManager/node/Node.js +16 -29
  32. package/dist/src/NodeManager/node/api/ApiHandler.js +2 -3
  33. package/dist/src/NodeManager/node/api/middlewares/index.d.ts +0 -1
  34. package/dist/src/NodeManager/node/api/middlewares/index.js +0 -1
  35. package/dist/src/NodeManager/node/api/routes/post/index.d.ts +0 -1
  36. package/dist/src/NodeManager/node/api/routes/post/index.js +0 -1
  37. package/dist/src/NodeManager/node/grid/gridHandler.d.ts +2 -8
  38. package/dist/src/NodeManager/node/grid/gridHandler.js +10 -143
  39. package/dist/src/NodeManager/node/health/healthHandler.d.ts +1 -1
  40. package/dist/src/NodeManager/node/health/healthHandler.js +13 -11
  41. package/dist/src/NodeManager/node/job/JobRegistry.js +5 -3
  42. package/dist/src/NodeManager/node/job/defination/strategy/IpfsJobDefinitionStrategy.d.ts +1 -3
  43. package/dist/src/NodeManager/node/job/defination/strategy/IpfsJobDefinitionStrategy.js +2 -4
  44. package/dist/src/NodeManager/node/job/jobExternalUtil.d.ts +2 -3
  45. package/dist/src/NodeManager/node/job/jobExternalUtil.js +4 -4
  46. package/dist/src/NodeManager/node/job/jobHandler.js +5 -3
  47. package/dist/src/NodeManager/node/key/keyHandler.d.ts +0 -1
  48. package/dist/src/NodeManager/node/key/keyHandler.js +1 -38
  49. package/dist/src/NodeManager/node/market/benchmark.d.ts +15 -0
  50. package/dist/src/NodeManager/node/market/benchmark.js +84 -0
  51. package/dist/src/NodeManager/node/market/hostManager.d.ts +114 -0
  52. package/dist/src/NodeManager/node/market/hostManager.js +112 -0
  53. package/dist/src/NodeManager/node/market/marketAccess.d.ts +8 -0
  54. package/dist/src/NodeManager/node/market/marketAccess.js +53 -0
  55. package/dist/src/NodeManager/node/market/marketHandler.d.ts +10 -3
  56. package/dist/src/NodeManager/node/market/marketHandler.js +88 -6
  57. package/dist/src/NodeManager/node/register/index.d.ts +2 -12
  58. package/dist/src/NodeManager/node/register/index.js +12 -56
  59. package/dist/src/NodeManager/node/resource/resourceManager.d.ts +2 -1
  60. package/dist/src/NodeManager/node/resource/resourceManager.js +4 -4
  61. package/dist/src/NodeManager/sdk/index.js +4 -14
  62. package/dist/src/NodeManager/utils/wslCheck.js +1 -1
  63. package/dist/src/cli/createNosanaCli.js +2 -0
  64. package/dist/src/ipfs/IpfsClient.d.ts +7 -0
  65. package/dist/src/ipfs/IpfsClient.js +17 -0
  66. package/npm-shrinkwrap.json +30 -2
  67. package/package.json +5 -3
  68. package/dist/src/NodeManager/client/index.d.ts +0 -4
  69. package/dist/src/NodeManager/client/index.js +0 -14
  70. package/dist/src/NodeManager/node/api/middlewares/rest/verifyBackendSignatureMiddleware.d.ts +0 -3
  71. package/dist/src/NodeManager/node/api/middlewares/rest/verifyBackendSignatureMiddleware.js +0 -20
  72. package/dist/src/NodeManager/node/api/routes/post/node-validation.d.ts +0 -4
  73. package/dist/src/NodeManager/node/api/routes/post/node-validation.js +0 -1787
  74. package/dist/src/NodeManager/node/specs/specsHandler.d.ts +0 -17
  75. package/dist/src/NodeManager/node/specs/specsHandler.js +0 -135
  76. package/dist/src/NodeManager/node/specs/type.d.ts +0 -15
  77. /package/dist/src/NodeManager/{node/specs/type.js → clients/types.utils.js} +0 -0
@@ -1,8 +1,19 @@
1
+ import chalk from "chalk";
2
+ import { HostManager } from "./hostManager.js";
3
+ import { Benchmark } from "./benchmark.js";
4
+ import { NodeNotRegisteredError } from "../../errors/NodeNotRegisteredError.js";
5
+ import { NodeBannedError } from "../../errors/NodeBannedError.js";
6
+ import { NodeNotQualifiedError } from "../../errors/NodeNotQualifiedError.js";
7
+ import { MarketAccessHandler } from "./marketAccess.js";
8
+ import { sleep } from "../../utils/utils.js";
1
9
  export class MarketHandler {
2
- constructor(sdk) {
10
+ constructor(sdk, provider, repository) {
3
11
  this.sdk = sdk;
12
+ this.provider = provider;
13
+ this.repository = repository;
4
14
  this.inMarket = false;
5
15
  this.address = this.sdk.solana.provider.wallet.publicKey;
16
+ this.marketAccessHandler = new MarketAccessHandler(this.sdk);
6
17
  }
7
18
  clear() {
8
19
  this.market = undefined;
@@ -13,6 +24,77 @@ export class MarketHandler {
13
24
  setInMarket() {
14
25
  this.inMarket = true;
15
26
  }
27
+ async request(requestedMarket) {
28
+ const result = await HostManager.requestMarket(requestedMarket);
29
+ // Not registered - caller will handle registration and retry
30
+ if (result.notRegistered) {
31
+ throw new NodeNotRegisteredError();
32
+ }
33
+ // Node is banned
34
+ if (result.status === "REJECTED") {
35
+ throw new NodeBannedError();
36
+ }
37
+ // Host manager wants us to run a benchmark first
38
+ if (result.jobDefinition) {
39
+ const benchmark = new Benchmark(result.benchmarkId ?? result.jobDefinition.id, result.jobDefinition, this.sdk, this.provider, this.repository);
40
+ await benchmark.run();
41
+ return await this.request(requestedMarket);
42
+ }
43
+ // Sign and send SFT mint/burn transaction if provided
44
+ if (result.market?.sftTx) {
45
+ await this.marketAccessHandler.mintAccessKey(result.market.sftTx);
46
+ await sleep(30);
47
+ await HostManager.syncNodeAfterMint(this.address.toString());
48
+ }
49
+ if (result.feedbackReport) {
50
+ this.logFeedbackReport(result.feedbackReport);
51
+ }
52
+ if (!result.market?.address) {
53
+ throw new NodeNotQualifiedError();
54
+ }
55
+ const onchainMarket = await this.sdk.jobs.getMarket(result.market.address);
56
+ if (!onchainMarket) {
57
+ throw new Error(`Requested market ${result.market.address} not found on-chain`);
58
+ }
59
+ if (result.feedbackReport && !result.feedbackReport.passed) {
60
+ console.log(chalk.yellow("Some thresholds are still below the target market requirements, but access was granted. Continuing."));
61
+ }
62
+ this.market = onchainMarket;
63
+ return onchainMarket;
64
+ }
65
+ logFeedbackReport(report) {
66
+ const targetMarketLabel = report.marketName ?? report.marketAddress;
67
+ const total = report.metrics.length;
68
+ let passedCount = 0;
69
+ let nameWidth = 24;
70
+ for (const metric of report.metrics) {
71
+ if (metric.passed)
72
+ passedCount++;
73
+ if (metric.metricKey.length > nameWidth)
74
+ nameWidth = metric.metricKey.length;
75
+ }
76
+ const failedCount = total - passedCount;
77
+ console.log("\n" + chalk.bgCyan.black.bold(" TARGET MARKET ") + "\n");
78
+ console.log(` ${chalk.bold(targetMarketLabel)}`);
79
+ console.log();
80
+ for (const metric of report.metrics) {
81
+ const icon = metric.passed ? chalk.green(" ✔ ") : chalk.red(" ✖ ");
82
+ const measuredStr = metric.measuredValue !== undefined
83
+ ? ` ${chalk.cyan(`measured: ${metric.measuredValue}`)}`
84
+ : "";
85
+ console.log(icon + chalk.bold(metric.metricKey.padEnd(nameWidth)) + measuredStr);
86
+ console.log(chalk.gray(` rule: ${metric.ruleDescription}`));
87
+ if (!metric.passed && metric.failureMessage) {
88
+ console.log(chalk.yellow(` ↳ ${metric.failureMessage}`));
89
+ }
90
+ }
91
+ if (report.passed) {
92
+ console.log(chalk.bgGreen.black.bold(` Node currently meets all ${total} market requirements for ${targetMarketLabel} `) + "\n");
93
+ }
94
+ else {
95
+ console.log(chalk.bgYellow.black.bold(` Node currently meets ${passedCount} of ${total} market requirements for ${targetMarketLabel} — ${failedCount} still need improvement `) + "\n");
96
+ }
97
+ }
16
98
  async check(market) {
17
99
  try {
18
100
  return await this.sdk.jobs.getMarket(market);
@@ -38,7 +120,7 @@ export class MarketHandler {
38
120
  return this.market;
39
121
  }
40
122
  catch (error) {
41
- throw new Error('market does not exists');
123
+ throw new Error("market does not exists");
42
124
  }
43
125
  }
44
126
  getMarket() {
@@ -50,7 +132,7 @@ export class MarketHandler {
50
132
  return this.market;
51
133
  }
52
134
  catch (error) {
53
- throw new Error('market does not exists');
135
+ throw new Error("market does not exists");
54
136
  }
55
137
  }
56
138
  async checkQueuedInMarket() {
@@ -66,7 +148,7 @@ export class MarketHandler {
66
148
  }
67
149
  async join(accessKey) {
68
150
  if (!this.market) {
69
- throw new Error('market not defined');
151
+ throw new Error("market not defined");
70
152
  }
71
153
  try {
72
154
  await this.sdk.jobs.work(this.market.address, accessKey);
@@ -105,7 +187,7 @@ export class MarketHandler {
105
187
  updateCallback(queuedMarketInfo);
106
188
  }
107
189
  catch (error) {
108
- console.warn('\nCould not update queue status', error);
190
+ console.warn("\nCould not update queue status", error);
109
191
  }
110
192
  // Check market queue status every minute
111
193
  this.checkQueuedInterval = setInterval(async () => {
@@ -114,7 +196,7 @@ export class MarketHandler {
114
196
  updateCallback(queuedMarketInfo);
115
197
  }
116
198
  catch (error) {
117
- console.warn('\nCould not update queue status', error);
199
+ console.warn("\nCould not update queue status", error);
118
200
  }
119
201
  }, 60000);
120
202
  }
@@ -1,16 +1,6 @@
1
- import { Client } from '@nosana/sdk';
2
- import { Provider } from '../../provider/Provider.js';
3
- import { NodeRepository } from '../../repository/NodeRepository.js';
4
1
  export declare class RegisterHandler {
5
- private sdk;
6
- private provider;
7
- private repository;
8
- private nodeId;
9
2
  private answers;
10
- constructor(sdk: Client, provider: Provider, repository: NodeRepository);
11
- private gainConstent;
12
- private generateHeaders;
13
- private runSpecs;
14
- private submitOnboarding;
3
+ constructor();
4
+ private gainConsent;
15
5
  register(): Promise<void>;
16
6
  }
@@ -1,88 +1,44 @@
1
1
  import chalk from 'chalk';
2
2
  import { confirm, input } from '@inquirer/prompts';
3
- import { configs } from '../../configs/configs.js';
4
- import { specsAndNetworkJob } from '../../../static/index.js';
3
+ import { HostManager } from '../market/hostManager.js';
5
4
  import { applyLoggingProxyToClass } from '../../monitoring/proxy/loggingProxy.js';
6
- import { generateRandomId } from '../utils/generateRandomId.js';
7
- import TaskManager from '../task/TaskManager.js';
8
5
  export class RegisterHandler {
9
- constructor(sdk, provider, repository) {
10
- this.sdk = sdk;
11
- this.provider = provider;
12
- this.repository = repository;
13
- this.nodeId = this.sdk.solana.provider.wallet.publicKey.toString();
6
+ constructor() {
14
7
  applyLoggingProxyToClass(this);
15
8
  }
16
- async gainConstent() {
9
+ async gainConsent() {
17
10
  this.answers = {
18
11
  email: await input({
19
- message: 'Your Email Address',
12
+ message: "Your Email Address",
20
13
  validate: (value) => /\S+@\S+\.\S+/.test(value),
21
14
  }),
22
15
  discord: await input({
23
- message: 'Join our Discord server for direct support from the team and community: https://nosana.com/discord. \nDiscord username:',
16
+ message: "Join our Discord server for direct support from the team and community: https://nosana.com/discord. \nDiscord username:",
24
17
  }),
25
18
  twitter: await input({
26
19
  message: "What is your Twitter username? (If you don't use Twitter, leave blank)",
27
20
  }),
28
21
  };
29
22
  if (!this.answers.email) {
30
- console.log(chalk.red('Email address is required'));
23
+ console.log(chalk.red("Email address is required"));
31
24
  process.exit();
32
25
  }
33
26
  const accept = await confirm({
34
- message: `Have you read the Participation Agreement and agree to the terms and conditions contained within?\nParticipation agreement: ${chalk.blue('https://drive.google.com/file/d/1dFWCT5Zon08pCPrftdxB9ByvbuDafTwy/view')}`,
27
+ message: `Have you read the Participation Agreement and agree to the terms and conditions contained within?\nParticipation agreement: ${chalk.blue("https://drive.google.com/file/d/1dFWCT5Zon08pCPrftdxB9ByvbuDafTwy/view")}`,
35
28
  });
36
29
  if (!accept) {
37
- console.log(chalk.red('To continue you must agree to the terms and conditions'));
30
+ console.log(chalk.red("To continue you must agree to the terms and conditions"));
38
31
  process.exit();
39
32
  }
40
33
  }
41
- // TODO: convert backend to support sdk.authorization.generate()
42
- async generateHeaders() {
43
- const conf = configs();
44
- const signature = (await this.sdk.solana.signMessage(conf.signMessage));
45
- const base64Signature = Buffer.from(signature).toString('base64');
46
- return `${this.nodeId}:${base64Signature}`;
47
- }
48
- async runSpecs() {
49
- const flowId = generateRandomId(32);
50
- const task = new TaskManager(this.provider, this.repository, flowId, this.sdk.solana.wallet.publicKey.toString(), specsAndNetworkJob);
51
- task.bootstrap();
52
- await task.start();
53
- const result = this.repository.getFlow(flowId);
54
- if (!result || result.state.status !== 'success') {
55
- throw new Error('Registration Benchmark Failed');
56
- }
57
- return result;
58
- }
59
- async submitOnboarding(results) {
34
+ async register() {
35
+ await this.gainConsent();
60
36
  try {
61
- const headers = new Headers();
62
- headers.append('Authorization', await this.generateHeaders());
63
- headers.append('Content-Type', 'application/json');
64
- const joinTestGridResult = await fetch(`${configs().backendUrl}/nodes/join-test-grid`, {
65
- method: 'POST',
66
- headers,
67
- body: JSON.stringify({
68
- ...this.answers,
69
- nodeAddress: this.nodeId,
70
- results,
71
- }),
72
- });
73
- if (!joinTestGridResult.ok) {
74
- console.error('Error whilst submiting onboarding request.');
75
- process.exit();
76
- }
37
+ await HostManager.register(this.answers.email, this.answers.discord, this.answers.twitter);
77
38
  }
78
39
  catch (error) {
79
- console.error('Error whilst submiting onboarding request.', error);
40
+ console.error('Error registering node:', error);
80
41
  process.exit();
81
42
  }
82
43
  }
83
- async register() {
84
- await this.gainConstent();
85
- const results = await this.runSpecs();
86
- await this.submitOnboarding(results.state.opStates);
87
- }
88
44
  }
@@ -1,3 +1,4 @@
1
+ import { Market } from '@nosana/sdk';
1
2
  import { Resource } from '@nosana/sdk/dist/types/resources.js';
2
3
  import { ContainerOrchestrationInterface } from '../../provider/containerOrchestration/interface.js';
3
4
  import { NodeRepository } from '../../repository/NodeRepository.js';
@@ -11,7 +12,7 @@ export declare class ResourceManager {
11
12
  volumes: VolumeManager;
12
13
  constructor(containerOrchestration: ContainerOrchestrationInterface, repository: NodeRepository);
13
14
  resyncResourcesDB(): Promise<void>;
14
- fetchMarketRequiredResources(market: string): Promise<void>;
15
+ fetchMarketRequiredResources(market: Market | string): Promise<void>;
15
16
  prune(): Promise<void>;
16
17
  getResourceVolumes(resources: Resource[], controller: AbortController): Promise<{
17
18
  dest: string;
@@ -1,4 +1,4 @@
1
- import { clientSelector } from '../../client/index.js';
1
+ import { HostManager } from '../market/hostManager.js';
2
2
  import { createResourceName } from './helpers/createResourceName.js';
3
3
  import { ImageManager } from './image/imageManager.js';
4
4
  import { VolumeManager } from './volume/volumeManager.js';
@@ -17,10 +17,10 @@ export class ResourceManager {
17
17
  }
18
18
  }
19
19
  async fetchMarketRequiredResources(market) {
20
- this.required_market = market;
20
+ this.required_market = typeof market === 'string' ? market : market.address.toString();
21
21
  try {
22
- const { data, error } = await clientSelector().GET('/api/markets/{id}/required-resources', { params: { path: { id: market } } });
23
- if (error) {
22
+ const data = await HostManager.getMarketRequiredResources(this.required_market);
23
+ if (!data) {
24
24
  return;
25
25
  }
26
26
  await this.images.pullMarketRequiredImages(data.required_images);
@@ -9,6 +9,7 @@ import { colors } from '../utils/utils.js';
9
9
  import { OUTPUT_EVENTS } from '../../output-formatter/outputEvents.js';
10
10
  import { outputFormatSelector } from '../../output-formatter/outputFormatSelector.js';
11
11
  import { configs } from '../configs/configs.js';
12
+ import { HostManager } from '../node/market/hostManager.js';
12
13
  let nosana;
13
14
  let nosBalance, solBalance;
14
15
  export function setSDKInstance(instance) {
@@ -62,24 +63,13 @@ export async function setSDK(network, rpc, market, keyfile, options) {
62
63
  }
63
64
  nosana = new Client(network, wallet, config);
64
65
  if (!rpc && network === 'mainnet' && wallet) {
65
- // sign message for authentication
66
- const signature = (await nosana.solana.signMessage(envConfig.signMessage));
67
- const base64Signature = Buffer.from(signature).toString('base64');
68
- const node = nosana.solana.wallet.publicKey.toString();
69
66
  try {
70
- const response = await fetch(`${envConfig.backendUrl}/rpc`, {
71
- method: 'GET',
72
- headers: {
73
- Authorization: `${node}:${base64Signature}`,
74
- 'Content-Type': 'application/json',
75
- },
76
- });
77
- const rpcFromBackend = await response.json();
78
- if (response.status !== 200) {
67
+ const rpcFromHostManager = await HostManager.getRpcUrl();
68
+ if (typeof rpcFromHostManager !== 'string') {
79
69
  console.log(chalk.yellow('Using default solana RPC. Some commands might not work, please provide your own with the --rpc option'));
80
70
  // throw new Error(rpcFromBackend.message);
81
71
  }
82
- config.solana.network = rpcFromBackend.url;
72
+ config.solana.network = rpcFromHostManager;
83
73
  nosana = new Client(network, wallet, config);
84
74
  }
85
75
  catch (e) {
@@ -48,7 +48,7 @@ export function checkWSLStatus(systemEnvironment) {
48
48
  }
49
49
  if (isWSLBlockActive()) {
50
50
  displayWSLBlockMessage();
51
- throw new WSLBlockedError();
51
+ // throw new WSLBlockedError();
52
52
  }
53
53
  displayWSLWarning();
54
54
  }
@@ -6,6 +6,7 @@ import { outputFormatSelector } from '../output-formatter/outputFormatSelector.j
6
6
  import { setSDK } from '../NodeManager/sdk/index.js';
7
7
  import { configs } from '../NodeManager/configs/configs.js';
8
8
  import { NodeConfigsSingleton } from '../NodeManager/configs/NodeConfigs.js';
9
+ import { IpfsClientSingleton } from '../ipfs/IpfsClient.js';
9
10
  import { runNodeCommand } from './commands/run/command.js';
10
11
  import { startNodeCommand } from './commands/start/command.js';
11
12
  import { nodePruneCommand } from './commands/prune/command.js';
@@ -23,6 +24,7 @@ export const createNosanaCLI = (version) => new Command()
23
24
  .hook('preAction', async (command, actionCommand) => {
24
25
  const opts = actionCommand.optsWithGlobals();
25
26
  NodeConfigsSingleton.getInstance(opts);
27
+ IpfsClientSingleton.set();
26
28
  let market = opts.market;
27
29
  if (opts.network || opts.wallet) {
28
30
  await setSDK(opts.network, opts.rpc, market, opts.wallet, actionCommand.opts());
@@ -0,0 +1,7 @@
1
+ import { type IPFSConfig, type NosanaIpfsClient } from '@nosana/ipfs';
2
+ export declare const IpfsClientSingleton: {
3
+ set(config?: Partial<IPFSConfig>): NosanaIpfsClient;
4
+ pin: (data: object) => Promise<string>;
5
+ pinFile: (path: string) => Promise<string>;
6
+ retrieve: <T>(hash: string | Array<number>) => Promise<T>;
7
+ };
@@ -0,0 +1,17 @@
1
+ import { createIpfsClient, } from '@nosana/ipfs';
2
+ let instance = null;
3
+ function getInstance() {
4
+ if (!instance) {
5
+ throw new Error('IpfsClient has not been initialized. Call IpfsClientSingleton.set() first.');
6
+ }
7
+ return instance;
8
+ }
9
+ export const IpfsClientSingleton = {
10
+ set(config) {
11
+ instance = createIpfsClient(config);
12
+ return instance;
13
+ },
14
+ pin: (data) => getInstance().pin(data),
15
+ pinFile: (path) => getInstance().pinFile(path),
16
+ retrieve: (hash) => getInstance().retrieve(hash),
17
+ };
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@nosana/node",
3
- "version": "1.1.14-rc",
3
+ "version": "1.1.15-rc",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@nosana/node",
9
- "version": "1.1.14-rc",
9
+ "version": "1.1.15-rc",
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
12
  "@coral-xyz/anchor": "^0.28.1-beta.1",
13
13
  "@inquirer/prompts": "^4.3.0",
14
+ "@nosana/ipfs": "^2.2.6",
14
15
  "@nosana/sdk": "^0.4.81",
15
16
  "@solana/web3.js": "^1.78.0",
16
17
  "bn.js": "^5.2.1",
@@ -1580,6 +1581,33 @@
1580
1581
  "node": ">= 8"
1581
1582
  }
1582
1583
  },
1584
+ "node_modules/@nosana/ipfs": {
1585
+ "version": "2.2.6",
1586
+ "resolved": "https://registry.npmjs.org/@nosana/ipfs/-/ipfs-2.2.6.tgz",
1587
+ "integrity": "sha512-T9FraaJu/BlC2nyG2Xx2zzBeSf+FSeUkWrkV7vNxG36fmILqhnX9eqtrTpHVNtVtsC+jS6W2b/NANQ/OFgY+VA==",
1588
+ "license": "MIT",
1589
+ "dependencies": {
1590
+ "bs58": "^5.0.0"
1591
+ },
1592
+ "engines": {
1593
+ "node": ">=20.18.0"
1594
+ }
1595
+ },
1596
+ "node_modules/@nosana/ipfs/node_modules/base-x": {
1597
+ "version": "4.0.1",
1598
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz",
1599
+ "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==",
1600
+ "license": "MIT"
1601
+ },
1602
+ "node_modules/@nosana/ipfs/node_modules/bs58": {
1603
+ "version": "5.0.0",
1604
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz",
1605
+ "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==",
1606
+ "license": "MIT",
1607
+ "dependencies": {
1608
+ "base-x": "^4.0.0"
1609
+ }
1610
+ },
1583
1611
  "node_modules/@nosana/sdk": {
1584
1612
  "version": "0.4.81",
1585
1613
  "resolved": "https://registry.npmjs.org/@nosana/sdk/-/sdk-0.4.81.tgz",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nosana/node",
3
- "version": "1.1.14-rc",
3
+ "version": "1.1.15-rc",
4
4
  "description": "",
5
5
  "bin": {
6
6
  "nosana-node": "./dist/src/index.js"
@@ -12,7 +12,8 @@
12
12
  "dev:podman:start": "./podman-run.sh start",
13
13
  "dev:podman:run": "./podman-run.sh run",
14
14
  "build": "npm run prepare && tsc && cp .env ./dist/ && cp .env.prd ./dist/ && cp .env.dev ./dist/",
15
- "generate": "openapi-typescript http://dashboard.k8s.prd.nos.ci/api/swagger/json -o ./src/NodeManager/client/schema.d.ts",
15
+ "generate": "npm run generate:host-manager",
16
+ "generate:host-manager": "openapi-typescript https://host-manager.k8s.dev.nos.ci/swagger/json -o ./src/NodeManager/clients/hostManager/schema.d.ts",
16
17
  "test": "APP_ENV=development DOCKER_CERT_PATH= vitest run",
17
18
  "ci:test": "APP_ENV=development DOCKER_CERT_PATH= vitest run --coverage --reporter=junit --outputFile=./test-report.xml",
18
19
  "test:watch": "APP_ENV=development DOCKER_CERT_PATH= vitest",
@@ -71,6 +72,7 @@
71
72
  "dependencies": {
72
73
  "@coral-xyz/anchor": "^0.28.1-beta.1",
73
74
  "@inquirer/prompts": "^4.3.0",
75
+ "@nosana/ipfs": "^2.2.6",
74
76
  "@nosana/sdk": "^0.4.81",
75
77
  "@solana/web3.js": "^1.78.0",
76
78
  "bn.js": "^5.2.1",
@@ -103,4 +105,4 @@
103
105
  "util": "^0.12.5",
104
106
  "yaml": "^2.8.0"
105
107
  }
106
- }
108
+ }
@@ -1,4 +0,0 @@
1
- import createClient from 'openapi-fetch';
2
- import { paths } from './schema.js';
3
- export type QueryClient = ReturnType<typeof createClient<paths>>;
4
- export declare const clientSelector: () => QueryClient;
@@ -1,14 +0,0 @@
1
- import createClient from 'openapi-fetch';
2
- import { configs } from '../configs/configs.js';
3
- export const clientSelector = () => {
4
- let instance = undefined;
5
- if (!instance) {
6
- instance = createClient({
7
- baseUrl: configs().backendUrl?.replace('/api', '') || '',
8
- headers: {
9
- 'Content-Type': 'application/json',
10
- },
11
- });
12
- }
13
- return instance;
14
- };
@@ -1,3 +0,0 @@
1
- import { NextFunction, Response } from 'express';
2
- import { NodeAPIRequest } from '../../types/index.js';
3
- export declare function verifyBackendSignatureMiddleware(req: NodeAPIRequest, res: Response, next: NextFunction): Promise<Response<any, Record<string, any>> | undefined>;
@@ -1,20 +0,0 @@
1
- import { PublicKey } from '@solana/web3.js';
2
- import { getSDK } from '../../../../sdk/index.js';
3
- import { configs } from '../../../../configs/configs.js';
4
- export async function verifyBackendSignatureMiddleware(req, res, next) {
5
- const sdk = getSDK();
6
- try {
7
- if (!sdk.authorization.validateHeader(req.headers, {
8
- expiry: 300,
9
- key: 'x-session-id',
10
- publicKey: new PublicKey(configs().backendAuthorizationAddress),
11
- })) {
12
- return res.status(401).send('Unauthorized Request');
13
- }
14
- res.locals['session_id'] = req.headers['x-session-id'].split(':')[0];
15
- next();
16
- }
17
- catch (error) {
18
- res.status(401).send(`Unauthorized Request: ${error.message}`);
19
- }
20
- }
@@ -1,4 +0,0 @@
1
- import { Response } from 'express';
2
- import { JobDefinition } from '@nosana/sdk';
3
- import { NodeAPIRequest } from '../../types/index.js';
4
- export declare function postNodeValidation(req: NodeAPIRequest<{}, JobDefinition>, res: Response): Promise<Response<any, Record<string, any>> | undefined>;